//===----------------------------------------------------------------------===//
//
// This source file is part of the Soto for AWS open source project
//
// Copyright (c) 2017-2024 the Soto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Soto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

// THIS FILE IS AUTOMATICALLY GENERATED by https://github.com/soto-project/soto-codegenerator.
// DO NOT EDIT.

#if canImport(FoundationEssentials)
import FoundationEssentials
#else
import Foundation
#endif
@_spi(SotoInternal) import SotoCore

extension ElasticBeanstalk {
    // MARK: Enums

    public enum ActionHistoryStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case completed = "Completed"
        case failed = "Failed"
        case unknown = "Unknown"
        public var description: String { return self.rawValue }
    }

    public enum ActionStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case pending = "Pending"
        case running = "Running"
        case scheduled = "Scheduled"
        case unknown = "Unknown"
        public var description: String { return self.rawValue }
    }

    public enum ActionType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case instanceRefresh = "InstanceRefresh"
        case platformUpdate = "PlatformUpdate"
        case unknown = "Unknown"
        public var description: String { return self.rawValue }
    }

    public enum ApplicationVersionStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case building = "Building"
        case failed = "Failed"
        case processed = "Processed"
        case processing = "Processing"
        case unprocessed = "Unprocessed"
        public var description: String { return self.rawValue }
    }

    public enum ComputeType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case buildGeneral1Large = "BUILD_GENERAL1_LARGE"
        case buildGeneral1Medium = "BUILD_GENERAL1_MEDIUM"
        case buildGeneral1Small = "BUILD_GENERAL1_SMALL"
        public var description: String { return self.rawValue }
    }

    public enum ConfigurationDeploymentStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case deployed = "deployed"
        case failed = "failed"
        case pending = "pending"
        public var description: String { return self.rawValue }
    }

    public enum ConfigurationOptionValueType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case list = "List"
        case scalar = "Scalar"
        public var description: String { return self.rawValue }
    }

    public enum EnvironmentHealth: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case green = "Green"
        case grey = "Grey"
        case red = "Red"
        case yellow = "Yellow"
        public var description: String { return self.rawValue }
    }

    public enum EnvironmentHealthAttribute: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case all = "All"
        case applicationMetrics = "ApplicationMetrics"
        case causes = "Causes"
        case color = "Color"
        case healthStatus = "HealthStatus"
        case instancesHealth = "InstancesHealth"
        case refreshedAt = "RefreshedAt"
        case status = "Status"
        public var description: String { return self.rawValue }
    }

    public enum EnvironmentHealthStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case degraded = "Degraded"
        case info = "Info"
        case noData = "NoData"
        case ok = "Ok"
        case pending = "Pending"
        case severe = "Severe"
        case suspended = "Suspended"
        case unknown = "Unknown"
        case warning = "Warning"
        public var description: String { return self.rawValue }
    }

    public enum EnvironmentInfoType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case bundle = "bundle"
        case tail = "tail"
        public var description: String { return self.rawValue }
    }

    public enum EnvironmentStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case aborting = "Aborting"
        case launching = "Launching"
        case linkingFrom = "LinkingFrom"
        case linkingTo = "LinkingTo"
        case ready = "Ready"
        case terminated = "Terminated"
        case terminating = "Terminating"
        case updating = "Updating"
        public var description: String { return self.rawValue }
    }

    public enum EventSeverity: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case debug = "DEBUG"
        case error = "ERROR"
        case fatal = "FATAL"
        case info = "INFO"
        case trace = "TRACE"
        case warn = "WARN"
        public var description: String { return self.rawValue }
    }

    public enum FailureType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case cancellationFailed = "CancellationFailed"
        case internalFailure = "InternalFailure"
        case invalidEnvironmentState = "InvalidEnvironmentState"
        case permissionsError = "PermissionsError"
        case rollbackFailed = "RollbackFailed"
        case rollbackSuccessful = "RollbackSuccessful"
        case updateCancelled = "UpdateCancelled"
        public var description: String { return self.rawValue }
    }

    public enum InstancesHealthAttribute: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case all = "All"
        case applicationMetrics = "ApplicationMetrics"
        case availabilityZone = "AvailabilityZone"
        case causes = "Causes"
        case color = "Color"
        case deployment = "Deployment"
        case healthStatus = "HealthStatus"
        case instanceType = "InstanceType"
        case launchedAt = "LaunchedAt"
        case refreshedAt = "RefreshedAt"
        case system = "System"
        public var description: String { return self.rawValue }
    }

    public enum PlatformStatus: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case creating = "Creating"
        case deleted = "Deleted"
        case deleting = "Deleting"
        case failed = "Failed"
        case ready = "Ready"
        public var description: String { return self.rawValue }
    }

    public enum SourceRepository: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case codeCommit = "CodeCommit"
        case s3 = "S3"
        public var description: String { return self.rawValue }
    }

    public enum SourceType: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case git = "Git"
        case zip = "Zip"
        public var description: String { return self.rawValue }
    }

    public enum ValidationSeverity: String, CustomStringConvertible, Codable, Sendable, CodingKeyRepresentable {
        case error = "error"
        case warning = "warning"
        public var description: String { return self.rawValue }
    }

    // MARK: Shapes

    public struct AbortEnvironmentUpdateMessage: AWSEncodableShape {
        /// This specifies the ID of the environment with the in-progress update that you want to cancel.
        public let environmentId: String?
        /// This specifies the name of the environment with the in-progress update that you want to cancel.
        public let environmentName: String?

        @inlinable
        public init(environmentId: String? = nil, environmentName: String? = nil) {
            self.environmentId = environmentId
            self.environmentName = environmentName
        }

        public func validate(name: String) throws {
            try self.validate(self.environmentName, name: "environmentName", parent: name, max: 40)
            try self.validate(self.environmentName, name: "environmentName", parent: name, min: 4)
        }

        private enum CodingKeys: String, CodingKey {
            case environmentId = "EnvironmentId"
            case environmentName = "EnvironmentName"
        }
    }

    public struct ApplicationDescription: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the application.
        public let applicationArn: String?
        /// The name of the application.
        public let applicationName: String?
        /// The names of the configuration templates associated with this application.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var configurationTemplates: [String]?
        /// The date when the application was created.
        public let dateCreated: Date?
        /// The date when the application was last modified.
        public let dateUpdated: Date?
        /// User-defined description of the application.
        public let description: String?
        /// The lifecycle settings for the application.
        public let resourceLifecycleConfig: ApplicationResourceLifecycleConfig?
        /// The names of the versions for this application.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var versions: [String]?

        @inlinable
        public init(applicationArn: String? = nil, applicationName: String? = nil, configurationTemplates: [String]? = nil, dateCreated: Date? = nil, dateUpdated: Date? = nil, description: String? = nil, resourceLifecycleConfig: ApplicationResourceLifecycleConfig? = nil, versions: [String]? = nil) {
            self.applicationArn = applicationArn
            self.applicationName = applicationName
            self.configurationTemplates = configurationTemplates
            self.dateCreated = dateCreated
            self.dateUpdated = dateUpdated
            self.description = description
            self.resourceLifecycleConfig = resourceLifecycleConfig
            self.versions = versions
        }

        private enum CodingKeys: String, CodingKey {
            case applicationArn = "ApplicationArn"
            case applicationName = "ApplicationName"
            case configurationTemplates = "ConfigurationTemplates"
            case dateCreated = "DateCreated"
            case dateUpdated = "DateUpdated"
            case description = "Description"
            case resourceLifecycleConfig = "ResourceLifecycleConfig"
            case versions = "Versions"
        }
    }

    public struct ApplicationDescriptionMessage: AWSDecodableShape {
        ///  The ApplicationDescription of the application.
        public let application: ApplicationDescription?

        @inlinable
        public init(application: ApplicationDescription? = nil) {
            self.application = application
        }

        private enum CodingKeys: String, CodingKey {
            case application = "Application"
        }
    }

    public struct ApplicationDescriptionsMessage: AWSDecodableShape {
        /// This parameter contains a list of ApplicationDescription.
        @OptionalCustomCoding<StandardArrayCoder<ApplicationDescription>>
        public var applications: [ApplicationDescription]?

        @inlinable
        public init(applications: [ApplicationDescription]? = nil) {
            self.applications = applications
        }

        private enum CodingKeys: String, CodingKey {
            case applications = "Applications"
        }
    }

    public struct ApplicationMetrics: AWSDecodableShape {
        /// The amount of time that the metrics cover (usually 10 seconds). For example, you might have 5 requests (request_count) within the most recent time slice of 10 seconds (duration).
        public let duration: Int?
        /// Represents the average latency for the slowest X percent of requests over the last 10 seconds. Latencies are in seconds with one millisecond resolution.
        public let latency: Latency?
        /// Average number of requests handled by the web server per second over the last 10 seconds.
        public let requestCount: Int?
        /// Represents the percentage of requests over the last 10 seconds that resulted in each type of status code response.
        public let statusCodes: StatusCodes?

        @inlinable
        public init(duration: Int? = nil, latency: Latency? = nil, requestCount: Int? = nil, statusCodes: StatusCodes? = nil) {
            self.duration = duration
            self.latency = latency
            self.requestCount = requestCount
            self.statusCodes = statusCodes
        }

        private enum CodingKeys: String, CodingKey {
            case duration = "Duration"
            case latency = "Latency"
            case requestCount = "RequestCount"
            case statusCodes = "StatusCodes"
        }
    }

    public struct ApplicationResourceLifecycleConfig: AWSEncodableShape & AWSDecodableShape {
        /// The ARN of an IAM service role that Elastic Beanstalk has permission to assume. The ServiceRole property is required the first time that you provide a VersionLifecycleConfig for the application in one of the supporting calls (CreateApplication or UpdateApplicationResourceLifecycle). After you provide it once, in either one of the calls, Elastic Beanstalk persists the Service Role with the application, and you don't need to specify it again in subsequent UpdateApplicationResourceLifecycle calls. You can, however, specify it in subsequent calls to change the Service Role to another value.
        public let serviceRole: String?
        /// Defines lifecycle settings for application versions.
        public let versionLifecycleConfig: ApplicationVersionLifecycleConfig?

        @inlinable
        public init(serviceRole: String? = nil, versionLifecycleConfig: ApplicationVersionLifecycleConfig? = nil) {
            self.serviceRole = serviceRole
            self.versionLifecycleConfig = versionLifecycleConfig
        }

        private enum CodingKeys: String, CodingKey {
            case serviceRole = "ServiceRole"
            case versionLifecycleConfig = "VersionLifecycleConfig"
        }
    }

    public struct ApplicationResourceLifecycleDescriptionMessage: AWSDecodableShape {
        /// The name of the application.
        public let applicationName: String?
        /// The lifecycle configuration.
        public let resourceLifecycleConfig: ApplicationResourceLifecycleConfig?

        @inlinable
        public init(applicationName: String? = nil, resourceLifecycleConfig: ApplicationResourceLifecycleConfig? = nil) {
            self.applicationName = applicationName
            self.resourceLifecycleConfig = resourceLifecycleConfig
        }

        private enum CodingKeys: String, CodingKey {
            case applicationName = "ApplicationName"
            case resourceLifecycleConfig = "ResourceLifecycleConfig"
        }
    }

    public struct ApplicationVersionDescription: AWSDecodableShape {
        /// The name of the application to which the application version belongs.
        public let applicationName: String?
        /// The Amazon Resource Name (ARN) of the application version.
        public let applicationVersionArn: String?
        /// Reference to the artifact from the AWS CodeBuild build.
        public let buildArn: String?
        /// The creation date of the application version.
        public let dateCreated: Date?
        /// The last modified date of the application version.
        public let dateUpdated: Date?
        /// The description of the application version.
        public let description: String?
        /// If the version's source code was retrieved from AWS CodeCommit, the location of the source code for the application version.
        public let sourceBuildInformation: SourceBuildInformation?
        /// The storage location of the application version's source bundle in Amazon S3.
        public let sourceBundle: S3Location?
        /// The processing status of the application version. Reflects the state of the application version during its creation. Many of the values are only applicable if you specified True for the Process parameter of the CreateApplicationVersion action. The following list describes the possible values.    Unprocessed – Application version wasn't pre-processed or validated. Elastic Beanstalk will validate configuration files during deployment of the application version to an environment.    Processing – Elastic Beanstalk is currently processing the application version.    Building – Application version is currently undergoing an AWS CodeBuild build.    Processed – Elastic Beanstalk was successfully pre-processed and validated.    Failed – Either the AWS CodeBuild build failed or configuration files didn't pass validation. This application version isn't usable.
        public let status: ApplicationVersionStatus?
        /// A unique identifier for the application version.
        public let versionLabel: String?

        @inlinable
        public init(applicationName: String? = nil, applicationVersionArn: String? = nil, buildArn: String? = nil, dateCreated: Date? = nil, dateUpdated: Date? = nil, description: String? = nil, sourceBuildInformation: SourceBuildInformation? = nil, sourceBundle: S3Location? = nil, status: ApplicationVersionStatus? = nil, versionLabel: String? = nil) {
            self.applicationName = applicationName
            self.applicationVersionArn = applicationVersionArn
            self.buildArn = buildArn
            self.dateCreated = dateCreated
            self.dateUpdated = dateUpdated
            self.description = description
            self.sourceBuildInformation = sourceBuildInformation
            self.sourceBundle = sourceBundle
            self.status = status
            self.versionLabel = versionLabel
        }

        private enum CodingKeys: String, CodingKey {
            case applicationName = "ApplicationName"
            case applicationVersionArn = "ApplicationVersionArn"
            case buildArn = "BuildArn"
            case dateCreated = "DateCreated"
            case dateUpdated = "DateUpdated"
            case description = "Description"
            case sourceBuildInformation = "SourceBuildInformation"
            case sourceBundle = "SourceBundle"
            case status = "Status"
            case versionLabel = "VersionLabel"
        }
    }

    public struct ApplicationVersionDescriptionMessage: AWSDecodableShape {
        ///  The ApplicationVersionDescription of the application version.
        public let applicationVersion: ApplicationVersionDescription?

        @inlinable
        public init(applicationVersion: ApplicationVersionDescription? = nil) {
            self.applicationVersion = applicationVersion
        }

        private enum CodingKeys: String, CodingKey {
            case applicationVersion = "ApplicationVersion"
        }
    }

    public struct ApplicationVersionDescriptionsMessage: AWSDecodableShape {
        /// List of ApplicationVersionDescription objects sorted in order of creation.
        @OptionalCustomCoding<StandardArrayCoder<ApplicationVersionDescription>>
        public var applicationVersions: [ApplicationVersionDescription]?
        /// In a paginated request, the token that you can pass in a subsequent request to get the next response page.
        public let nextToken: String?

        @inlinable
        public init(applicationVersions: [ApplicationVersionDescription]? = nil, nextToken: String? = nil) {
            self.applicationVersions = applicationVersions
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case applicationVersions = "ApplicationVersions"
            case nextToken = "NextToken"
        }
    }

    public struct ApplicationVersionLifecycleConfig: AWSEncodableShape & AWSDecodableShape {
        /// Specify a max age rule to restrict the length of time that application versions are retained for an application.
        public let maxAgeRule: MaxAgeRule?
        /// Specify a max count rule to restrict the number of application versions that are retained for an application.
        public let maxCountRule: MaxCountRule?

        @inlinable
        public init(maxAgeRule: MaxAgeRule? = nil, maxCountRule: MaxCountRule? = nil) {
            self.maxAgeRule = maxAgeRule
            self.maxCountRule = maxCountRule
        }

        private enum CodingKeys: String, CodingKey {
            case maxAgeRule = "MaxAgeRule"
            case maxCountRule = "MaxCountRule"
        }
    }

    public struct ApplyEnvironmentManagedActionRequest: AWSEncodableShape {
        /// The action ID of the scheduled managed action to execute.
        public let actionId: String
        /// The environment ID of the target environment.
        public let environmentId: String?
        /// The name of the target environment.
        public let environmentName: String?

        @inlinable
        public init(actionId: String, environmentId: String? = nil, environmentName: String? = nil) {
            self.actionId = actionId
            self.environmentId = environmentId
            self.environmentName = environmentName
        }

        private enum CodingKeys: String, CodingKey {
            case actionId = "ActionId"
            case environmentId = "EnvironmentId"
            case environmentName = "EnvironmentName"
        }
    }

    public struct ApplyEnvironmentManagedActionResult: AWSDecodableShape {
        /// A description of the managed action.
        public let actionDescription: String?
        /// The action ID of the managed action.
        public let actionId: String?
        /// The type of managed action.
        public let actionType: ActionType?
        /// The status of the managed action.
        public let status: String?

        @inlinable
        public init(actionDescription: String? = nil, actionId: String? = nil, actionType: ActionType? = nil, status: String? = nil) {
            self.actionDescription = actionDescription
            self.actionId = actionId
            self.actionType = actionType
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case actionDescription = "ActionDescription"
            case actionId = "ActionId"
            case actionType = "ActionType"
            case status = "Status"
        }
    }

    public struct AssociateEnvironmentOperationsRoleMessage: AWSEncodableShape {
        /// The name of the environment to which to set the operations role.
        public let environmentName: String
        /// The Amazon Resource Name (ARN) of an existing IAM role to be used as the environment's operations role.
        public let operationsRole: String

        @inlinable
        public init(environmentName: String, operationsRole: String) {
            self.environmentName = environmentName
            self.operationsRole = operationsRole
        }

        public func validate(name: String) throws {
            try self.validate(self.environmentName, name: "environmentName", parent: name, max: 40)
            try self.validate(self.environmentName, name: "environmentName", parent: name, min: 4)
            try self.validate(self.operationsRole, name: "operationsRole", parent: name, max: 256)
            try self.validate(self.operationsRole, name: "operationsRole", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case environmentName = "EnvironmentName"
            case operationsRole = "OperationsRole"
        }
    }

    public struct AutoScalingGroup: AWSDecodableShape {
        /// The name of the AutoScalingGroup .
        public let name: String?

        @inlinable
        public init(name: String? = nil) {
            self.name = name
        }

        private enum CodingKeys: String, CodingKey {
            case name = "Name"
        }
    }

    public struct BuildConfiguration: AWSEncodableShape {
        /// The name of the artifact of the CodeBuild build. If provided, Elastic Beanstalk stores the build artifact in the S3 location  S3-bucket/resources/application-name/codebuild/codebuild-version-label-artifact-name.zip. If not provided, Elastic Beanstalk stores the build artifact in the S3 location  S3-bucket/resources/application-name/codebuild/codebuild-version-label.zip.
        public let artifactName: String?
        /// The Amazon Resource Name (ARN) of the AWS Identity and Access Management (IAM) role that enables AWS CodeBuild to interact with dependent AWS services on behalf of the AWS account.
        public let codeBuildServiceRole: String
        /// Information about the compute resources the build project will use.    BUILD_GENERAL1_SMALL: Use up to 3 GB memory and 2 vCPUs for builds     BUILD_GENERAL1_MEDIUM: Use up to 7 GB memory and 4 vCPUs for builds     BUILD_GENERAL1_LARGE: Use up to 15 GB memory and 8 vCPUs for builds
        public let computeType: ComputeType?
        /// The ID of the Docker image to use for this build project.
        public let image: String
        /// How long in minutes, from 5 to 480 (8 hours), for AWS CodeBuild to wait until timing out any related build that does not get marked as completed. The default is 60 minutes.
        public let timeoutInMinutes: Int?

        @inlinable
        public init(artifactName: String? = nil, codeBuildServiceRole: String, computeType: ComputeType? = nil, image: String, timeoutInMinutes: Int? = nil) {
            self.artifactName = artifactName
            self.codeBuildServiceRole = codeBuildServiceRole
            self.computeType = computeType
            self.image = image
            self.timeoutInMinutes = timeoutInMinutes
        }

        public func validate(name: String) throws {
            try self.validate(self.codeBuildServiceRole, name: "codeBuildServiceRole", parent: name, pattern: "\\S")
            try self.validate(self.image, name: "image", parent: name, pattern: "\\S")
        }

        private enum CodingKeys: String, CodingKey {
            case artifactName = "ArtifactName"
            case codeBuildServiceRole = "CodeBuildServiceRole"
            case computeType = "ComputeType"
            case image = "Image"
            case timeoutInMinutes = "TimeoutInMinutes"
        }
    }

    public struct Builder: AWSDecodableShape {
        /// The ARN of the builder.
        public let arn: String?

        @inlinable
        public init(arn: String? = nil) {
            self.arn = arn
        }

        private enum CodingKeys: String, CodingKey {
            case arn = "ARN"
        }
    }

    public struct CPUUtilization: AWSDecodableShape {
        /// Percentage of time that the CPU has spent in the Idle state over the last 10 seconds.
        public let idle: Double?
        /// Available on Linux environments only. Percentage of time that the CPU has spent in the I/O Wait state over the last 10 seconds.
        public let ioWait: Double?
        /// Available on Linux environments only. Percentage of time that the CPU has spent in the IRQ state over the last 10 seconds.
        public let irq: Double?
        /// Available on Linux environments only. Percentage of time that the CPU has spent in the Nice state over the last 10 seconds.
        public let nice: Double?
        /// Available on Windows environments only. Percentage of time that the CPU has spent in the Privileged state over the last 10 seconds.
        public let privileged: Double?
        /// Available on Linux environments only. Percentage of time that the CPU has spent in the SoftIRQ state over the last 10 seconds.
        public let softIRQ: Double?
        /// Available on Linux environments only. Percentage of time that the CPU has spent in the System state over the last 10 seconds.
        public let system: Double?
        /// Percentage of time that the CPU has spent in the User state over the last 10 seconds.
        public let user: Double?

        @inlinable
        public init(idle: Double? = nil, ioWait: Double? = nil, irq: Double? = nil, nice: Double? = nil, privileged: Double? = nil, softIRQ: Double? = nil, system: Double? = nil, user: Double? = nil) {
            self.idle = idle
            self.ioWait = ioWait
            self.irq = irq
            self.nice = nice
            self.privileged = privileged
            self.softIRQ = softIRQ
            self.system = system
            self.user = user
        }

        private enum CodingKeys: String, CodingKey {
            case idle = "Idle"
            case ioWait = "IOWait"
            case irq = "IRQ"
            case nice = "Nice"
            case privileged = "Privileged"
            case softIRQ = "SoftIRQ"
            case system = "System"
            case user = "User"
        }
    }

    public struct CheckDNSAvailabilityMessage: AWSEncodableShape {
        /// The prefix used when this CNAME is reserved.
        public let cnamePrefix: String

        @inlinable
        public init(cnamePrefix: String) {
            self.cnamePrefix = cnamePrefix
        }

        public func validate(name: String) throws {
            try self.validate(self.cnamePrefix, name: "cnamePrefix", parent: name, max: 63)
            try self.validate(self.cnamePrefix, name: "cnamePrefix", parent: name, min: 4)
        }

        private enum CodingKeys: String, CodingKey {
            case cnamePrefix = "CNAMEPrefix"
        }
    }

    public struct CheckDNSAvailabilityResultMessage: AWSDecodableShape {
        /// Indicates if the specified CNAME is available:    true : The CNAME is available.    false : The CNAME is not available.
        public let available: Bool?
        /// The fully qualified CNAME to reserve when CreateEnvironment is called with the provided prefix.
        public let fullyQualifiedCNAME: String?

        @inlinable
        public init(available: Bool? = nil, fullyQualifiedCNAME: String? = nil) {
            self.available = available
            self.fullyQualifiedCNAME = fullyQualifiedCNAME
        }

        private enum CodingKeys: String, CodingKey {
            case available = "Available"
            case fullyQualifiedCNAME = "FullyQualifiedCNAME"
        }
    }

    public struct ComposeEnvironmentsMessage: AWSEncodableShape {
        /// The name of the application to which the specified source bundles belong.
        public let applicationName: String?
        /// The name of the group to which the target environments belong. Specify a group name only if the environment name defined in each target environment's manifest ends with a + (plus) character. See Environment Manifest (env.yaml) for details.
        public let groupName: String?
        /// A list of version labels, specifying one or more application source bundles that belong to the target application. Each source bundle must include an environment manifest that specifies the name of the environment and the name of the solution stack to use, and optionally can specify environment links to create.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var versionLabels: [String]?

        @inlinable
        public init(applicationName: String? = nil, groupName: String? = nil, versionLabels: [String]? = nil) {
            self.applicationName = applicationName
            self.groupName = groupName
            self.versionLabels = versionLabels
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationName, name: "applicationName", parent: name, max: 100)
            try self.validate(self.applicationName, name: "applicationName", parent: name, min: 1)
            try self.validate(self.groupName, name: "groupName", parent: name, max: 19)
            try self.validate(self.groupName, name: "groupName", parent: name, min: 1)
            try self.versionLabels?.forEach {
                try validate($0, name: "versionLabels[]", parent: name, max: 100)
                try validate($0, name: "versionLabels[]", parent: name, min: 1)
            }
        }

        private enum CodingKeys: String, CodingKey {
            case applicationName = "ApplicationName"
            case groupName = "GroupName"
            case versionLabels = "VersionLabels"
        }
    }

    public struct ConfigurationOptionDescription: AWSDecodableShape {
        /// An indication of which action is required if the value for this configuration option changes:    NoInterruption : There is no interruption to the environment or application availability.    RestartEnvironment : The environment is entirely restarted, all AWS resources are deleted and recreated, and the environment is unavailable during the process.    RestartApplicationServer : The environment is available the entire time. However, a short application outage occurs when the application servers on the running Amazon EC2 instances are restarted.
        public let changeSeverity: String?
        /// The default value for this configuration option.
        public let defaultValue: String?
        /// If specified, the configuration option must be a string value no longer than this value.
        public let maxLength: Int?
        /// If specified, the configuration option must be a numeric value less than this value.
        public let maxValue: Int?
        /// If specified, the configuration option must be a numeric value greater than this value.
        public let minValue: Int?
        /// The name of the configuration option.
        public let name: String?
        /// A unique namespace identifying the option's associated AWS resource.
        public let namespace: String?
        /// If specified, the configuration option must be a string value that satisfies this regular expression.
        public let regex: OptionRestrictionRegex?
        /// An indication of whether the user defined this configuration option:    true : This configuration option was defined by the user. It is a valid choice for specifying if this as an Option to Remove when updating configuration settings.     false : This configuration was not defined by the user.   Constraint: You can remove only UserDefined options from a configuration.  Valid Values: true | false
        public let userDefined: Bool?
        /// If specified, values for the configuration option are selected from this list.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var valueOptions: [String]?
        /// An indication of which type of values this option has and whether it is allowable to select one or more than one of the possible values:    Scalar : Values for this option are a single selection from the possible values, or an unformatted string, or numeric value governed by the MIN/MAX/Regex constraints.    List : Values for this option are multiple selections from the possible values.    Boolean : Values for this option are either true or false .    Json : Values for this option are a JSON representation of a ConfigDocument.
        public let valueType: ConfigurationOptionValueType?

        @inlinable
        public init(changeSeverity: String? = nil, defaultValue: String? = nil, maxLength: Int? = nil, maxValue: Int? = nil, minValue: Int? = nil, name: String? = nil, namespace: String? = nil, regex: OptionRestrictionRegex? = nil, userDefined: Bool? = nil, valueOptions: [String]? = nil, valueType: ConfigurationOptionValueType? = nil) {
            self.changeSeverity = changeSeverity
            self.defaultValue = defaultValue
            self.maxLength = maxLength
            self.maxValue = maxValue
            self.minValue = minValue
            self.name = name
            self.namespace = namespace
            self.regex = regex
            self.userDefined = userDefined
            self.valueOptions = valueOptions
            self.valueType = valueType
        }

        private enum CodingKeys: String, CodingKey {
            case changeSeverity = "ChangeSeverity"
            case defaultValue = "DefaultValue"
            case maxLength = "MaxLength"
            case maxValue = "MaxValue"
            case minValue = "MinValue"
            case name = "Name"
            case namespace = "Namespace"
            case regex = "Regex"
            case userDefined = "UserDefined"
            case valueOptions = "ValueOptions"
            case valueType = "ValueType"
        }
    }

    public struct ConfigurationOptionSetting: AWSEncodableShape & AWSDecodableShape {
        /// A unique namespace that identifies the option's associated AWS resource.
        public let namespace: String?
        /// The name of the configuration option.
        public let optionName: String?
        /// A unique resource name for the option setting. Use it for a time–based scaling configuration option.
        public let resourceName: String?
        /// The current value for the configuration option.
        public let value: String?

        @inlinable
        public init(namespace: String? = nil, optionName: String? = nil, resourceName: String? = nil, value: String? = nil) {
            self.namespace = namespace
            self.optionName = optionName
            self.resourceName = resourceName
            self.value = value
        }

        public func validate(name: String) throws {
            try self.validate(self.resourceName, name: "resourceName", parent: name, max: 256)
            try self.validate(self.resourceName, name: "resourceName", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case namespace = "Namespace"
            case optionName = "OptionName"
            case resourceName = "ResourceName"
            case value = "Value"
        }
    }

    public struct ConfigurationOptionsDescription: AWSDecodableShape {
        ///  A list of ConfigurationOptionDescription.
        @OptionalCustomCoding<StandardArrayCoder<ConfigurationOptionDescription>>
        public var options: [ConfigurationOptionDescription]?
        /// The ARN of the platform version.
        public let platformArn: String?
        /// The name of the solution stack these configuration options belong to.
        public let solutionStackName: String?

        @inlinable
        public init(options: [ConfigurationOptionDescription]? = nil, platformArn: String? = nil, solutionStackName: String? = nil) {
            self.options = options
            self.platformArn = platformArn
            self.solutionStackName = solutionStackName
        }

        private enum CodingKeys: String, CodingKey {
            case options = "Options"
            case platformArn = "PlatformArn"
            case solutionStackName = "SolutionStackName"
        }
    }

    public struct ConfigurationSettingsDescription: AWSDecodableShape {
        /// The name of the application associated with this configuration set.
        public let applicationName: String?
        /// The date (in UTC time) when this configuration set was created.
        public let dateCreated: Date?
        /// The date (in UTC time) when this configuration set was last modified.
        public let dateUpdated: Date?
        ///  If this configuration set is associated with an environment, the DeploymentStatus parameter indicates the deployment status of this configuration set:     null: This configuration is not associated with a running environment.    pending: This is a draft configuration that is not deployed to the associated environment but is in the process of deploying.    deployed: This is the configuration that is currently deployed to the associated running environment.    failed: This is a draft configuration that failed to successfully deploy.
        public let deploymentStatus: ConfigurationDeploymentStatus?
        /// Describes this configuration set.
        public let description: String?
        ///  If not null, the name of the environment for this configuration set.
        public let environmentName: String?
        /// A list of the configuration options and their values in this configuration set.
        @OptionalCustomCoding<StandardArrayCoder<ConfigurationOptionSetting>>
        public var optionSettings: [ConfigurationOptionSetting]?
        /// The ARN of the platform version.
        public let platformArn: String?
        /// The name of the solution stack this configuration set uses.
        public let solutionStackName: String?
        ///  If not null, the name of the configuration template for this configuration set.
        public let templateName: String?

        @inlinable
        public init(applicationName: String? = nil, dateCreated: Date? = nil, dateUpdated: Date? = nil, deploymentStatus: ConfigurationDeploymentStatus? = nil, description: String? = nil, environmentName: String? = nil, optionSettings: [ConfigurationOptionSetting]? = nil, platformArn: String? = nil, solutionStackName: String? = nil, templateName: String? = nil) {
            self.applicationName = applicationName
            self.dateCreated = dateCreated
            self.dateUpdated = dateUpdated
            self.deploymentStatus = deploymentStatus
            self.description = description
            self.environmentName = environmentName
            self.optionSettings = optionSettings
            self.platformArn = platformArn
            self.solutionStackName = solutionStackName
            self.templateName = templateName
        }

        private enum CodingKeys: String, CodingKey {
            case applicationName = "ApplicationName"
            case dateCreated = "DateCreated"
            case dateUpdated = "DateUpdated"
            case deploymentStatus = "DeploymentStatus"
            case description = "Description"
            case environmentName = "EnvironmentName"
            case optionSettings = "OptionSettings"
            case platformArn = "PlatformArn"
            case solutionStackName = "SolutionStackName"
            case templateName = "TemplateName"
        }
    }

    public struct ConfigurationSettingsDescriptions: AWSDecodableShape {
        ///  A list of ConfigurationSettingsDescription.
        @OptionalCustomCoding<StandardArrayCoder<ConfigurationSettingsDescription>>
        public var configurationSettings: [ConfigurationSettingsDescription]?

        @inlinable
        public init(configurationSettings: [ConfigurationSettingsDescription]? = nil) {
            self.configurationSettings = configurationSettings
        }

        private enum CodingKeys: String, CodingKey {
            case configurationSettings = "ConfigurationSettings"
        }
    }

    public struct ConfigurationSettingsValidationMessages: AWSDecodableShape {
        ///  A list of ValidationMessage.
        @OptionalCustomCoding<StandardArrayCoder<ValidationMessage>>
        public var messages: [ValidationMessage]?

        @inlinable
        public init(messages: [ValidationMessage]? = nil) {
            self.messages = messages
        }

        private enum CodingKeys: String, CodingKey {
            case messages = "Messages"
        }
    }

    public struct CreateApplicationMessage: AWSEncodableShape {
        /// The name of the application. Must be unique within your account.
        public let applicationName: String
        /// Your description of the application.
        public let description: String?
        /// Specifies an application resource lifecycle configuration to prevent your application from accumulating too many versions.
        public let resourceLifecycleConfig: ApplicationResourceLifecycleConfig?
        /// Specifies the tags applied to the application. Elastic Beanstalk applies these tags only to the application. Environments that you create in the application don't inherit the tags.
        @OptionalCustomCoding<StandardArrayCoder<Tag>>
        public var tags: [Tag]?

        @inlinable
        public init(applicationName: String, description: String? = nil, resourceLifecycleConfig: ApplicationResourceLifecycleConfig? = nil, tags: [Tag]? = nil) {
            self.applicationName = applicationName
            self.description = description
            self.resourceLifecycleConfig = resourceLifecycleConfig
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationName, name: "applicationName", parent: name, max: 100)
            try self.validate(self.applicationName, name: "applicationName", parent: name, min: 1)
            try self.validate(self.description, name: "description", parent: name, max: 200)
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case applicationName = "ApplicationName"
            case description = "Description"
            case resourceLifecycleConfig = "ResourceLifecycleConfig"
            case tags = "Tags"
        }
    }

    public struct CreateApplicationVersionMessage: AWSEncodableShape {
        ///  The name of the application. If no application is found with this name, and AutoCreateApplication is false, returns an InvalidParameterValue error.
        public let applicationName: String
        /// Set to true to create an application with the specified name if it doesn't already exist.
        public let autoCreateApplication: Bool?
        /// Settings for an AWS CodeBuild build.
        public let buildConfiguration: BuildConfiguration?
        /// A description of this application version.
        public let description: String?
        /// Pre-processes and validates the environment manifest (env.yaml) and configuration files (*.config files in the .ebextensions folder) in the source bundle. Validating configuration files can identify issues prior to deploying the application version to an environment. You must turn processing on for application versions that you create using AWS CodeBuild or AWS CodeCommit. For application versions built from a source bundle in Amazon S3, processing is optional.  The Process option validates Elastic Beanstalk configuration files. It doesn't validate your application's configuration files, like proxy server or Docker configuration.
        public let process: Bool?
        /// Specify a commit in an AWS CodeCommit Git repository to use as the source code for the application version.
        public let sourceBuildInformation: SourceBuildInformation?
        /// The Amazon S3 bucket and key that identify the location of the source bundle for this version.  The Amazon S3 bucket must be in the same region as the environment.  Specify a source bundle in S3 or a commit in an AWS CodeCommit repository (with SourceBuildInformation), but not both. If neither SourceBundle nor SourceBuildInformation are provided, Elastic Beanstalk uses a sample application.
        public let sourceBundle: S3Location?
        /// Specifies the tags applied to the application version. Elastic Beanstalk applies these tags only to the application version. Environments that use the application version don't inherit the tags.
        @OptionalCustomCoding<StandardArrayCoder<Tag>>
        public var tags: [Tag]?
        /// A label identifying this version. Constraint: Must be unique per application. If an application version already exists with this label for the specified application, AWS Elastic Beanstalk returns an InvalidParameterValue error.
        public let versionLabel: String

        @inlinable
        public init(applicationName: String, autoCreateApplication: Bool? = nil, buildConfiguration: BuildConfiguration? = nil, description: String? = nil, process: Bool? = nil, sourceBuildInformation: SourceBuildInformation? = nil, sourceBundle: S3Location? = nil, tags: [Tag]? = nil, versionLabel: String) {
            self.applicationName = applicationName
            self.autoCreateApplication = autoCreateApplication
            self.buildConfiguration = buildConfiguration
            self.description = description
            self.process = process
            self.sourceBuildInformation = sourceBuildInformation
            self.sourceBundle = sourceBundle
            self.tags = tags
            self.versionLabel = versionLabel
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationName, name: "applicationName", parent: name, max: 100)
            try self.validate(self.applicationName, name: "applicationName", parent: name, min: 1)
            try self.buildConfiguration?.validate(name: "\(name).buildConfiguration")
            try self.validate(self.description, name: "description", parent: name, max: 200)
            try self.sourceBuildInformation?.validate(name: "\(name).sourceBuildInformation")
            try self.sourceBundle?.validate(name: "\(name).sourceBundle")
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.versionLabel, name: "versionLabel", parent: name, max: 100)
            try self.validate(self.versionLabel, name: "versionLabel", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case applicationName = "ApplicationName"
            case autoCreateApplication = "AutoCreateApplication"
            case buildConfiguration = "BuildConfiguration"
            case description = "Description"
            case process = "Process"
            case sourceBuildInformation = "SourceBuildInformation"
            case sourceBundle = "SourceBundle"
            case tags = "Tags"
            case versionLabel = "VersionLabel"
        }
    }

    public struct CreateConfigurationTemplateMessage: AWSEncodableShape {
        /// The name of the Elastic Beanstalk application to associate with this configuration template.
        public let applicationName: String
        /// An optional description for this configuration.
        public let description: String?
        /// The ID of an environment whose settings you want to use to create the configuration template. You must specify EnvironmentId if you don't specify PlatformArn, SolutionStackName, or SourceConfiguration.
        public let environmentId: String?
        /// Option values for the Elastic Beanstalk configuration, such as the instance type. If specified, these values override the values obtained from the solution stack or the source configuration template. For a complete list of Elastic Beanstalk configuration options, see Option Values in the AWS Elastic Beanstalk Developer Guide.
        @OptionalCustomCoding<StandardArrayCoder<ConfigurationOptionSetting>>
        public var optionSettings: [ConfigurationOptionSetting]?
        /// The Amazon Resource Name (ARN) of the custom platform. For more information, see  Custom Platforms in the AWS Elastic Beanstalk Developer Guide.  If you specify PlatformArn, then don't specify SolutionStackName.
        public let platformArn: String?
        /// The name of an Elastic Beanstalk solution stack (platform version) that this configuration uses. For example, 64bit Amazon Linux 2013.09 running Tomcat 7 Java 7. A solution stack specifies the operating system, runtime, and application server for a configuration template. It also determines the set of configuration options as well as the possible and default values. For more information, see Supported Platforms in the AWS Elastic Beanstalk Developer Guide. You must specify SolutionStackName if you don't specify PlatformArn, EnvironmentId, or SourceConfiguration. Use the  ListAvailableSolutionStacks API to obtain a list of available solution stacks.
        public let solutionStackName: String?
        /// An Elastic Beanstalk configuration template to base this one on. If specified, Elastic Beanstalk uses the configuration values from the specified configuration template to create a new configuration. Values specified in OptionSettings override any values obtained from the SourceConfiguration. You must specify SourceConfiguration if you don't specify PlatformArn, EnvironmentId, or SolutionStackName. Constraint: If both solution stack name and source configuration are specified, the solution stack of the source configuration template must match the specified solution stack name.
        public let sourceConfiguration: SourceConfiguration?
        /// Specifies the tags applied to the configuration template.
        @OptionalCustomCoding<StandardArrayCoder<Tag>>
        public var tags: [Tag]?
        /// The name of the configuration template. Constraint: This name must be unique per application.
        public let templateName: String

        @inlinable
        public init(applicationName: String, description: String? = nil, environmentId: String? = nil, optionSettings: [ConfigurationOptionSetting]? = nil, platformArn: String? = nil, solutionStackName: String? = nil, sourceConfiguration: SourceConfiguration? = nil, tags: [Tag]? = nil, templateName: String) {
            self.applicationName = applicationName
            self.description = description
            self.environmentId = environmentId
            self.optionSettings = optionSettings
            self.platformArn = platformArn
            self.solutionStackName = solutionStackName
            self.sourceConfiguration = sourceConfiguration
            self.tags = tags
            self.templateName = templateName
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationName, name: "applicationName", parent: name, max: 100)
            try self.validate(self.applicationName, name: "applicationName", parent: name, min: 1)
            try self.validate(self.description, name: "description", parent: name, max: 200)
            try self.optionSettings?.forEach {
                try $0.validate(name: "\(name).optionSettings[]")
            }
            try self.sourceConfiguration?.validate(name: "\(name).sourceConfiguration")
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.templateName, name: "templateName", parent: name, max: 100)
            try self.validate(self.templateName, name: "templateName", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case applicationName = "ApplicationName"
            case description = "Description"
            case environmentId = "EnvironmentId"
            case optionSettings = "OptionSettings"
            case platformArn = "PlatformArn"
            case solutionStackName = "SolutionStackName"
            case sourceConfiguration = "SourceConfiguration"
            case tags = "Tags"
            case templateName = "TemplateName"
        }
    }

    public struct CreateEnvironmentMessage: AWSEncodableShape {
        /// The name of the application that is associated with this environment.
        public let applicationName: String
        /// If specified, the environment attempts to use this value as the prefix for the CNAME in your Elastic Beanstalk environment URL. If not specified, the CNAME is generated automatically by appending a random alphanumeric string to the environment name.
        public let cnamePrefix: String?
        /// Your description for this environment.
        public let description: String?
        /// A unique name for the environment. Constraint: Must be from 4 to 40 characters in length. The name can contain only letters, numbers, and hyphens. It can't start or end with a hyphen. This name must be unique within a region in your account. If the specified name already exists in the region, Elastic Beanstalk returns an InvalidParameterValue error.  If you don't specify the CNAMEPrefix parameter, the environment name becomes part of the CNAME, and therefore part of the visible URL for your application.
        public let environmentName: String?
        /// The name of the group to which the target environment belongs. Specify a group name only if the environment's name is specified in an environment manifest and not with the environment name parameter. See Environment Manifest (env.yaml) for details.
        public let groupName: String?
        /// The Amazon Resource Name (ARN) of an existing IAM role to be used as the environment's operations role. If specified, Elastic Beanstalk uses the operations role for permissions to downstream services during this call and during subsequent calls acting on this environment. To specify an operations role, you must have the iam:PassRole permission for the role. For more information, see Operations roles in the AWS Elastic Beanstalk Developer Guide.
        public let operationsRole: String?
        /// If specified, AWS Elastic Beanstalk sets the specified configuration options to the requested value in the configuration set for the new environment. These override the values obtained from the solution stack or the configuration template.
        @OptionalCustomCoding<StandardArrayCoder<ConfigurationOptionSetting>>
        public var optionSettings: [ConfigurationOptionSetting]?
        /// A list of custom user-defined configuration options to remove from the configuration set for this new environment.
        @OptionalCustomCoding<StandardArrayCoder<OptionSpecification>>
        public var optionsToRemove: [OptionSpecification]?
        /// The Amazon Resource Name (ARN) of the custom platform to use with the environment. For more information, see Custom Platforms in the AWS Elastic Beanstalk Developer Guide.  If you specify PlatformArn, don't specify SolutionStackName.
        public let platformArn: String?
        /// The name of an Elastic Beanstalk solution stack (platform version) to use with the environment. If specified, Elastic Beanstalk sets the configuration values to the default values associated with the specified solution stack. For a list of current solution stacks, see Elastic Beanstalk Supported Platforms in the AWS Elastic Beanstalk Platforms guide.  If you specify SolutionStackName, don't specify PlatformArn or TemplateName.
        public let solutionStackName: String?
        /// Specifies the tags applied to resources in the environment.
        @OptionalCustomCoding<StandardArrayCoder<Tag>>
        public var tags: [Tag]?
        /// The name of the Elastic Beanstalk configuration template to use with the environment.  If you specify TemplateName, then don't specify  SolutionStackName.
        public let templateName: String?
        /// Specifies the tier to use in creating this environment. The environment tier that you choose determines whether Elastic Beanstalk provisions resources to support a web application that handles HTTP(S) requests or a web application that handles background-processing tasks.
        public let tier: EnvironmentTier?
        /// The name of the application version to deploy. Default: If not specified, Elastic Beanstalk attempts to deploy the sample application.
        public let versionLabel: String?

        @inlinable
        public init(applicationName: String, cnamePrefix: String? = nil, description: String? = nil, environmentName: String? = nil, groupName: String? = nil, operationsRole: String? = nil, optionSettings: [ConfigurationOptionSetting]? = nil, optionsToRemove: [OptionSpecification]? = nil, platformArn: String? = nil, solutionStackName: String? = nil, tags: [Tag]? = nil, templateName: String? = nil, tier: EnvironmentTier? = nil, versionLabel: String? = nil) {
            self.applicationName = applicationName
            self.cnamePrefix = cnamePrefix
            self.description = description
            self.environmentName = environmentName
            self.groupName = groupName
            self.operationsRole = operationsRole
            self.optionSettings = optionSettings
            self.optionsToRemove = optionsToRemove
            self.platformArn = platformArn
            self.solutionStackName = solutionStackName
            self.tags = tags
            self.templateName = templateName
            self.tier = tier
            self.versionLabel = versionLabel
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationName, name: "applicationName", parent: name, max: 100)
            try self.validate(self.applicationName, name: "applicationName", parent: name, min: 1)
            try self.validate(self.cnamePrefix, name: "cnamePrefix", parent: name, max: 63)
            try self.validate(self.cnamePrefix, name: "cnamePrefix", parent: name, min: 4)
            try self.validate(self.description, name: "description", parent: name, max: 200)
            try self.validate(self.environmentName, name: "environmentName", parent: name, max: 40)
            try self.validate(self.environmentName, name: "environmentName", parent: name, min: 4)
            try self.validate(self.groupName, name: "groupName", parent: name, max: 19)
            try self.validate(self.groupName, name: "groupName", parent: name, min: 1)
            try self.validate(self.operationsRole, name: "operationsRole", parent: name, max: 256)
            try self.validate(self.operationsRole, name: "operationsRole", parent: name, min: 1)
            try self.optionSettings?.forEach {
                try $0.validate(name: "\(name).optionSettings[]")
            }
            try self.optionsToRemove?.forEach {
                try $0.validate(name: "\(name).optionsToRemove[]")
            }
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
            try self.validate(self.templateName, name: "templateName", parent: name, max: 100)
            try self.validate(self.templateName, name: "templateName", parent: name, min: 1)
            try self.validate(self.versionLabel, name: "versionLabel", parent: name, max: 100)
            try self.validate(self.versionLabel, name: "versionLabel", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case applicationName = "ApplicationName"
            case cnamePrefix = "CNAMEPrefix"
            case description = "Description"
            case environmentName = "EnvironmentName"
            case groupName = "GroupName"
            case operationsRole = "OperationsRole"
            case optionSettings = "OptionSettings"
            case optionsToRemove = "OptionsToRemove"
            case platformArn = "PlatformArn"
            case solutionStackName = "SolutionStackName"
            case tags = "Tags"
            case templateName = "TemplateName"
            case tier = "Tier"
            case versionLabel = "VersionLabel"
        }
    }

    public struct CreatePlatformVersionRequest: AWSEncodableShape {
        /// The name of the builder environment.
        public let environmentName: String?
        /// The configuration option settings to apply to the builder environment.
        @OptionalCustomCoding<StandardArrayCoder<ConfigurationOptionSetting>>
        public var optionSettings: [ConfigurationOptionSetting]?
        /// The location of the platform definition archive in Amazon S3.
        public let platformDefinitionBundle: S3Location
        /// The name of your custom platform.
        public let platformName: String
        /// The number, such as 1.0.2, for the new platform version.
        public let platformVersion: String
        /// Specifies the tags applied to the new platform version. Elastic Beanstalk applies these tags only to the platform version. Environments that you create using the platform version don't inherit the tags.
        @OptionalCustomCoding<StandardArrayCoder<Tag>>
        public var tags: [Tag]?

        @inlinable
        public init(environmentName: String? = nil, optionSettings: [ConfigurationOptionSetting]? = nil, platformDefinitionBundle: S3Location, platformName: String, platformVersion: String, tags: [Tag]? = nil) {
            self.environmentName = environmentName
            self.optionSettings = optionSettings
            self.platformDefinitionBundle = platformDefinitionBundle
            self.platformName = platformName
            self.platformVersion = platformVersion
            self.tags = tags
        }

        public func validate(name: String) throws {
            try self.validate(self.environmentName, name: "environmentName", parent: name, max: 40)
            try self.validate(self.environmentName, name: "environmentName", parent: name, min: 4)
            try self.optionSettings?.forEach {
                try $0.validate(name: "\(name).optionSettings[]")
            }
            try self.platformDefinitionBundle.validate(name: "\(name).platformDefinitionBundle")
            try self.tags?.forEach {
                try $0.validate(name: "\(name).tags[]")
            }
        }

        private enum CodingKeys: String, CodingKey {
            case environmentName = "EnvironmentName"
            case optionSettings = "OptionSettings"
            case platformDefinitionBundle = "PlatformDefinitionBundle"
            case platformName = "PlatformName"
            case platformVersion = "PlatformVersion"
            case tags = "Tags"
        }
    }

    public struct CreatePlatformVersionResult: AWSDecodableShape {
        /// The builder used to create the custom platform.
        public let builder: Builder?
        /// Detailed information about the new version of the custom platform.
        public let platformSummary: PlatformSummary?

        @inlinable
        public init(builder: Builder? = nil, platformSummary: PlatformSummary? = nil) {
            self.builder = builder
            self.platformSummary = platformSummary
        }

        private enum CodingKeys: String, CodingKey {
            case builder = "Builder"
            case platformSummary = "PlatformSummary"
        }
    }

    public struct CreateStorageLocationResultMessage: AWSDecodableShape {
        /// The name of the Amazon S3 bucket created.
        public let s3Bucket: String?

        @inlinable
        public init(s3Bucket: String? = nil) {
            self.s3Bucket = s3Bucket
        }

        private enum CodingKeys: String, CodingKey {
            case s3Bucket = "S3Bucket"
        }
    }

    public struct CustomAmi: AWSDecodableShape {
        /// THe ID of the image used to create the custom AMI.
        public let imageId: String?
        /// The type of virtualization used to create the custom AMI.
        public let virtualizationType: String?

        @inlinable
        public init(imageId: String? = nil, virtualizationType: String? = nil) {
            self.imageId = imageId
            self.virtualizationType = virtualizationType
        }

        private enum CodingKeys: String, CodingKey {
            case imageId = "ImageId"
            case virtualizationType = "VirtualizationType"
        }
    }

    public struct DeleteApplicationMessage: AWSEncodableShape {
        /// The name of the application to delete.
        public let applicationName: String
        /// When set to true, running environments will be terminated before deleting the application.
        public let terminateEnvByForce: Bool?

        @inlinable
        public init(applicationName: String, terminateEnvByForce: Bool? = nil) {
            self.applicationName = applicationName
            self.terminateEnvByForce = terminateEnvByForce
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationName, name: "applicationName", parent: name, max: 100)
            try self.validate(self.applicationName, name: "applicationName", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case applicationName = "ApplicationName"
            case terminateEnvByForce = "TerminateEnvByForce"
        }
    }

    public struct DeleteApplicationVersionMessage: AWSEncodableShape {
        /// The name of the application to which the version belongs.
        public let applicationName: String
        /// Set to true to delete the source bundle from your storage bucket. Otherwise, the application version is deleted only from Elastic Beanstalk and the source bundle remains in Amazon S3.
        public let deleteSourceBundle: Bool?
        /// The label of the version to delete.
        public let versionLabel: String

        @inlinable
        public init(applicationName: String, deleteSourceBundle: Bool? = nil, versionLabel: String) {
            self.applicationName = applicationName
            self.deleteSourceBundle = deleteSourceBundle
            self.versionLabel = versionLabel
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationName, name: "applicationName", parent: name, max: 100)
            try self.validate(self.applicationName, name: "applicationName", parent: name, min: 1)
            try self.validate(self.versionLabel, name: "versionLabel", parent: name, max: 100)
            try self.validate(self.versionLabel, name: "versionLabel", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case applicationName = "ApplicationName"
            case deleteSourceBundle = "DeleteSourceBundle"
            case versionLabel = "VersionLabel"
        }
    }

    public struct DeleteConfigurationTemplateMessage: AWSEncodableShape {
        /// The name of the application to delete the configuration template from.
        public let applicationName: String
        /// The name of the configuration template to delete.
        public let templateName: String

        @inlinable
        public init(applicationName: String, templateName: String) {
            self.applicationName = applicationName
            self.templateName = templateName
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationName, name: "applicationName", parent: name, max: 100)
            try self.validate(self.applicationName, name: "applicationName", parent: name, min: 1)
            try self.validate(self.templateName, name: "templateName", parent: name, max: 100)
            try self.validate(self.templateName, name: "templateName", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case applicationName = "ApplicationName"
            case templateName = "TemplateName"
        }
    }

    public struct DeleteEnvironmentConfigurationMessage: AWSEncodableShape {
        /// The name of the application the environment is associated with.
        public let applicationName: String
        /// The name of the environment to delete the draft configuration from.
        public let environmentName: String

        @inlinable
        public init(applicationName: String, environmentName: String) {
            self.applicationName = applicationName
            self.environmentName = environmentName
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationName, name: "applicationName", parent: name, max: 100)
            try self.validate(self.applicationName, name: "applicationName", parent: name, min: 1)
            try self.validate(self.environmentName, name: "environmentName", parent: name, max: 40)
            try self.validate(self.environmentName, name: "environmentName", parent: name, min: 4)
        }

        private enum CodingKeys: String, CodingKey {
            case applicationName = "ApplicationName"
            case environmentName = "EnvironmentName"
        }
    }

    public struct DeletePlatformVersionRequest: AWSEncodableShape {
        /// The ARN of the version of the custom platform.
        public let platformArn: String?

        @inlinable
        public init(platformArn: String? = nil) {
            self.platformArn = platformArn
        }

        private enum CodingKeys: String, CodingKey {
            case platformArn = "PlatformArn"
        }
    }

    public struct DeletePlatformVersionResult: AWSDecodableShape {
        /// Detailed information about the version of the custom platform.
        public let platformSummary: PlatformSummary?

        @inlinable
        public init(platformSummary: PlatformSummary? = nil) {
            self.platformSummary = platformSummary
        }

        private enum CodingKeys: String, CodingKey {
            case platformSummary = "PlatformSummary"
        }
    }

    public struct Deployment: AWSDecodableShape {
        /// The ID of the deployment. This number increases by one each time that you deploy source code or change instance configuration settings.
        public let deploymentId: Int64?
        /// For in-progress deployments, the time that the deployment started. For completed deployments, the time that the deployment ended.
        public let deploymentTime: Date?
        /// The status of the deployment:    In Progress : The deployment is in progress.    Deployed : The deployment succeeded.    Failed : The deployment failed.
        public let status: String?
        /// The version label of the application version in the deployment.
        public let versionLabel: String?

        @inlinable
        public init(deploymentId: Int64? = nil, deploymentTime: Date? = nil, status: String? = nil, versionLabel: String? = nil) {
            self.deploymentId = deploymentId
            self.deploymentTime = deploymentTime
            self.status = status
            self.versionLabel = versionLabel
        }

        private enum CodingKeys: String, CodingKey {
            case deploymentId = "DeploymentId"
            case deploymentTime = "DeploymentTime"
            case status = "Status"
            case versionLabel = "VersionLabel"
        }
    }

    public struct DescribeAccountAttributesResult: AWSDecodableShape {
        /// The Elastic Beanstalk resource quotas associated with the calling AWS account.
        public let resourceQuotas: ResourceQuotas?

        @inlinable
        public init(resourceQuotas: ResourceQuotas? = nil) {
            self.resourceQuotas = resourceQuotas
        }

        private enum CodingKeys: String, CodingKey {
            case resourceQuotas = "ResourceQuotas"
        }
    }

    public struct DescribeApplicationVersionsMessage: AWSEncodableShape {
        /// Specify an application name to show only application versions for that application.
        public let applicationName: String?
        /// For a paginated request. Specify a maximum number of application versions to include in each response. If no MaxRecords is specified, all available application versions are retrieved in a single response.
        public let maxRecords: Int?
        /// For a paginated request. Specify a token from a previous response page to retrieve the next response page. All other parameter values must be identical to the ones specified in the initial request. If no NextToken is specified, the first page is retrieved.
        public let nextToken: String?
        /// Specify a version label to show a specific application version.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var versionLabels: [String]?

        @inlinable
        public init(applicationName: String? = nil, maxRecords: Int? = nil, nextToken: String? = nil, versionLabels: [String]? = nil) {
            self.applicationName = applicationName
            self.maxRecords = maxRecords
            self.nextToken = nextToken
            self.versionLabels = versionLabels
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationName, name: "applicationName", parent: name, max: 100)
            try self.validate(self.applicationName, name: "applicationName", parent: name, min: 1)
            try self.validate(self.maxRecords, name: "maxRecords", parent: name, max: 1000)
            try self.validate(self.maxRecords, name: "maxRecords", parent: name, min: 1)
            try self.versionLabels?.forEach {
                try validate($0, name: "versionLabels[]", parent: name, max: 100)
                try validate($0, name: "versionLabels[]", parent: name, min: 1)
            }
        }

        private enum CodingKeys: String, CodingKey {
            case applicationName = "ApplicationName"
            case maxRecords = "MaxRecords"
            case nextToken = "NextToken"
            case versionLabels = "VersionLabels"
        }
    }

    public struct DescribeApplicationsMessage: AWSEncodableShape {
        /// If specified, AWS Elastic Beanstalk restricts the returned descriptions to only include those with the specified names.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var applicationNames: [String]?

        @inlinable
        public init(applicationNames: [String]? = nil) {
            self.applicationNames = applicationNames
        }

        public func validate(name: String) throws {
            try self.applicationNames?.forEach {
                try validate($0, name: "applicationNames[]", parent: name, max: 100)
                try validate($0, name: "applicationNames[]", parent: name, min: 1)
            }
        }

        private enum CodingKeys: String, CodingKey {
            case applicationNames = "ApplicationNames"
        }
    }

    public struct DescribeConfigurationOptionsMessage: AWSEncodableShape {
        /// The name of the application associated with the configuration template or environment. Only needed if you want to describe the configuration options associated with either the configuration template or environment.
        public let applicationName: String?
        /// The name of the environment whose configuration options you want to describe.
        public let environmentName: String?
        /// If specified, restricts the descriptions to only the specified options.
        @OptionalCustomCoding<StandardArrayCoder<OptionSpecification>>
        public var options: [OptionSpecification]?
        /// The ARN of the custom platform.
        public let platformArn: String?
        /// The name of the solution stack whose configuration options you want to describe.
        public let solutionStackName: String?
        /// The name of the configuration template whose configuration options you want to describe.
        public let templateName: String?

        @inlinable
        public init(applicationName: String? = nil, environmentName: String? = nil, options: [OptionSpecification]? = nil, platformArn: String? = nil, solutionStackName: String? = nil, templateName: String? = nil) {
            self.applicationName = applicationName
            self.environmentName = environmentName
            self.options = options
            self.platformArn = platformArn
            self.solutionStackName = solutionStackName
            self.templateName = templateName
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationName, name: "applicationName", parent: name, max: 100)
            try self.validate(self.applicationName, name: "applicationName", parent: name, min: 1)
            try self.validate(self.environmentName, name: "environmentName", parent: name, max: 40)
            try self.validate(self.environmentName, name: "environmentName", parent: name, min: 4)
            try self.options?.forEach {
                try $0.validate(name: "\(name).options[]")
            }
            try self.validate(self.templateName, name: "templateName", parent: name, max: 100)
            try self.validate(self.templateName, name: "templateName", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case applicationName = "ApplicationName"
            case environmentName = "EnvironmentName"
            case options = "Options"
            case platformArn = "PlatformArn"
            case solutionStackName = "SolutionStackName"
            case templateName = "TemplateName"
        }
    }

    public struct DescribeConfigurationSettingsMessage: AWSEncodableShape {
        /// The application for the environment or configuration template.
        public let applicationName: String
        /// The name of the environment to describe. Condition: You must specify either this or a TemplateName, but not both. If you specify both, AWS Elastic Beanstalk returns an InvalidParameterCombination error. If you do not specify either, AWS Elastic Beanstalk returns MissingRequiredParameter error.
        public let environmentName: String?
        /// The name of the configuration template to describe. Conditional: You must specify either this parameter or an EnvironmentName, but not both. If you specify both, AWS Elastic Beanstalk returns an InvalidParameterCombination error. If you do not specify either, AWS Elastic Beanstalk returns a MissingRequiredParameter error.
        public let templateName: String?

        @inlinable
        public init(applicationName: String, environmentName: String? = nil, templateName: String? = nil) {
            self.applicationName = applicationName
            self.environmentName = environmentName
            self.templateName = templateName
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationName, name: "applicationName", parent: name, max: 100)
            try self.validate(self.applicationName, name: "applicationName", parent: name, min: 1)
            try self.validate(self.environmentName, name: "environmentName", parent: name, max: 40)
            try self.validate(self.environmentName, name: "environmentName", parent: name, min: 4)
            try self.validate(self.templateName, name: "templateName", parent: name, max: 100)
            try self.validate(self.templateName, name: "templateName", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case applicationName = "ApplicationName"
            case environmentName = "EnvironmentName"
            case templateName = "TemplateName"
        }
    }

    public struct DescribeEnvironmentHealthRequest: AWSEncodableShape {
        /// Specify the response elements to return. To retrieve all attributes, set to All. If no attribute names are specified, returns the name of the environment.
        @OptionalCustomCoding<StandardArrayCoder<EnvironmentHealthAttribute>>
        public var attributeNames: [EnvironmentHealthAttribute]?
        /// Specify the environment by ID. You must specify either this or an EnvironmentName, or both.
        public let environmentId: String?
        /// Specify the environment by name. You must specify either this or an EnvironmentName, or both.
        public let environmentName: String?

        @inlinable
        public init(attributeNames: [EnvironmentHealthAttribute]? = nil, environmentId: String? = nil, environmentName: String? = nil) {
            self.attributeNames = attributeNames
            self.environmentId = environmentId
            self.environmentName = environmentName
        }

        public func validate(name: String) throws {
            try self.validate(self.environmentName, name: "environmentName", parent: name, max: 40)
            try self.validate(self.environmentName, name: "environmentName", parent: name, min: 4)
        }

        private enum CodingKeys: String, CodingKey {
            case attributeNames = "AttributeNames"
            case environmentId = "EnvironmentId"
            case environmentName = "EnvironmentName"
        }
    }

    public struct DescribeEnvironmentHealthResult: AWSDecodableShape {
        /// Application request metrics for the environment.
        public let applicationMetrics: ApplicationMetrics?
        /// Descriptions of the data that contributed to the environment's current health status.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var causes: [String]?
        /// The health color of the environment.
        public let color: String?
        /// The environment's name.
        public let environmentName: String?
        /// The health status of the environment. For example, Ok.
        public let healthStatus: String?
        /// Summary health information for the instances in the environment.
        public let instancesHealth: InstanceHealthSummary?
        /// The date and time that the health information was retrieved.
        public let refreshedAt: Date?
        /// The environment's operational status. Ready, Launching, Updating, Terminating, or Terminated.
        public let status: EnvironmentHealth?

        @inlinable
        public init(applicationMetrics: ApplicationMetrics? = nil, causes: [String]? = nil, color: String? = nil, environmentName: String? = nil, healthStatus: String? = nil, instancesHealth: InstanceHealthSummary? = nil, refreshedAt: Date? = nil, status: EnvironmentHealth? = nil) {
            self.applicationMetrics = applicationMetrics
            self.causes = causes
            self.color = color
            self.environmentName = environmentName
            self.healthStatus = healthStatus
            self.instancesHealth = instancesHealth
            self.refreshedAt = refreshedAt
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case applicationMetrics = "ApplicationMetrics"
            case causes = "Causes"
            case color = "Color"
            case environmentName = "EnvironmentName"
            case healthStatus = "HealthStatus"
            case instancesHealth = "InstancesHealth"
            case refreshedAt = "RefreshedAt"
            case status = "Status"
        }
    }

    public struct DescribeEnvironmentManagedActionHistoryRequest: AWSEncodableShape {
        /// The environment ID of the target environment.
        public let environmentId: String?
        /// The name of the target environment.
        public let environmentName: String?
        /// The maximum number of items to return for a single request.
        public let maxItems: Int?
        /// The pagination token returned by a previous request.
        public let nextToken: String?

        @inlinable
        public init(environmentId: String? = nil, environmentName: String? = nil, maxItems: Int? = nil, nextToken: String? = nil) {
            self.environmentId = environmentId
            self.environmentName = environmentName
            self.maxItems = maxItems
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.environmentName, name: "environmentName", parent: name, max: 40)
            try self.validate(self.environmentName, name: "environmentName", parent: name, min: 4)
            try self.validate(self.maxItems, name: "maxItems", parent: name, max: 100)
            try self.validate(self.maxItems, name: "maxItems", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case environmentId = "EnvironmentId"
            case environmentName = "EnvironmentName"
            case maxItems = "MaxItems"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeEnvironmentManagedActionHistoryResult: AWSDecodableShape {
        /// A list of completed and failed managed actions.
        @OptionalCustomCoding<StandardArrayCoder<ManagedActionHistoryItem>>
        public var managedActionHistoryItems: [ManagedActionHistoryItem]?
        /// A pagination token that you pass to DescribeEnvironmentManagedActionHistory to get the next page of results.
        public let nextToken: String?

        @inlinable
        public init(managedActionHistoryItems: [ManagedActionHistoryItem]? = nil, nextToken: String? = nil) {
            self.managedActionHistoryItems = managedActionHistoryItems
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case managedActionHistoryItems = "ManagedActionHistoryItems"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeEnvironmentManagedActionsRequest: AWSEncodableShape {
        /// The environment ID of the target environment.
        public let environmentId: String?
        /// The name of the target environment.
        public let environmentName: String?
        /// To show only actions with a particular status, specify a status.
        public let status: ActionStatus?

        @inlinable
        public init(environmentId: String? = nil, environmentName: String? = nil, status: ActionStatus? = nil) {
            self.environmentId = environmentId
            self.environmentName = environmentName
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case environmentId = "EnvironmentId"
            case environmentName = "EnvironmentName"
            case status = "Status"
        }
    }

    public struct DescribeEnvironmentManagedActionsResult: AWSDecodableShape {
        /// A list of upcoming and in-progress managed actions.
        @OptionalCustomCoding<StandardArrayCoder<ManagedAction>>
        public var managedActions: [ManagedAction]?

        @inlinable
        public init(managedActions: [ManagedAction]? = nil) {
            self.managedActions = managedActions
        }

        private enum CodingKeys: String, CodingKey {
            case managedActions = "ManagedActions"
        }
    }

    public struct DescribeEnvironmentResourcesMessage: AWSEncodableShape {
        /// The ID of the environment to retrieve AWS resource usage data. Condition: You must specify either this or an EnvironmentName, or both. If you do not specify either, AWS Elastic Beanstalk returns MissingRequiredParameter error.
        public let environmentId: String?
        /// The name of the environment to retrieve AWS resource usage data. Condition: You must specify either this or an EnvironmentId, or both. If you do not specify either, AWS Elastic Beanstalk returns MissingRequiredParameter error.
        public let environmentName: String?

        @inlinable
        public init(environmentId: String? = nil, environmentName: String? = nil) {
            self.environmentId = environmentId
            self.environmentName = environmentName
        }

        public func validate(name: String) throws {
            try self.validate(self.environmentName, name: "environmentName", parent: name, max: 40)
            try self.validate(self.environmentName, name: "environmentName", parent: name, min: 4)
        }

        private enum CodingKeys: String, CodingKey {
            case environmentId = "EnvironmentId"
            case environmentName = "EnvironmentName"
        }
    }

    public struct DescribeEnvironmentsMessage: AWSEncodableShape {
        /// If specified, AWS Elastic Beanstalk restricts the returned descriptions to include only those that are associated with this application.
        public let applicationName: String?
        /// If specified, AWS Elastic Beanstalk restricts the returned descriptions to include only those that have the specified IDs.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var environmentIds: [String]?
        /// If specified, AWS Elastic Beanstalk restricts the returned descriptions to include only those that have the specified names.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var environmentNames: [String]?
        ///  If specified when IncludeDeleted is set to true, then environments deleted after this date are displayed.
        public let includedDeletedBackTo: Date?
        /// Indicates whether to include deleted environments:  true: Environments that have been deleted after IncludedDeletedBackTo are displayed.  false: Do not include deleted environments.
        public let includeDeleted: Bool?
        /// For a paginated request. Specify a maximum number of environments to include in each response. If no MaxRecords is specified, all available environments are retrieved in a single response.
        public let maxRecords: Int?
        /// For a paginated request. Specify a token from a previous response page to retrieve the next response page. All other parameter values must be identical to the ones specified in the initial request. If no NextToken is specified, the first page is retrieved.
        public let nextToken: String?
        /// If specified, AWS Elastic Beanstalk restricts the returned descriptions to include only those that are associated with this application version.
        public let versionLabel: String?

        @inlinable
        public init(applicationName: String? = nil, environmentIds: [String]? = nil, environmentNames: [String]? = nil, includedDeletedBackTo: Date? = nil, includeDeleted: Bool? = nil, maxRecords: Int? = nil, nextToken: String? = nil, versionLabel: String? = nil) {
            self.applicationName = applicationName
            self.environmentIds = environmentIds
            self.environmentNames = environmentNames
            self.includedDeletedBackTo = includedDeletedBackTo
            self.includeDeleted = includeDeleted
            self.maxRecords = maxRecords
            self.nextToken = nextToken
            self.versionLabel = versionLabel
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationName, name: "applicationName", parent: name, max: 100)
            try self.validate(self.applicationName, name: "applicationName", parent: name, min: 1)
            try self.environmentNames?.forEach {
                try validate($0, name: "environmentNames[]", parent: name, max: 40)
                try validate($0, name: "environmentNames[]", parent: name, min: 4)
            }
            try self.validate(self.maxRecords, name: "maxRecords", parent: name, max: 1000)
            try self.validate(self.maxRecords, name: "maxRecords", parent: name, min: 1)
            try self.validate(self.versionLabel, name: "versionLabel", parent: name, max: 100)
            try self.validate(self.versionLabel, name: "versionLabel", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case applicationName = "ApplicationName"
            case environmentIds = "EnvironmentIds"
            case environmentNames = "EnvironmentNames"
            case includedDeletedBackTo = "IncludedDeletedBackTo"
            case includeDeleted = "IncludeDeleted"
            case maxRecords = "MaxRecords"
            case nextToken = "NextToken"
            case versionLabel = "VersionLabel"
        }
    }

    public struct DescribeEventsMessage: AWSEncodableShape {
        /// If specified, AWS Elastic Beanstalk restricts the returned descriptions to include only those associated with this application.
        public let applicationName: String?
        ///  If specified, AWS Elastic Beanstalk restricts the returned descriptions to those that occur up to, but not including, the EndTime.
        public let endTime: Date?
        /// If specified, AWS Elastic Beanstalk restricts the returned descriptions to those associated with this environment.
        public let environmentId: String?
        /// If specified, AWS Elastic Beanstalk restricts the returned descriptions to those associated with this environment.
        public let environmentName: String?
        /// Specifies the maximum number of events that can be returned, beginning with the most recent event.
        public let maxRecords: Int?
        /// Pagination token. If specified, the events return the next batch of results.
        public let nextToken: String?
        /// The ARN of a custom platform version. If specified, AWS Elastic Beanstalk restricts the returned descriptions to those associated with this custom platform version.
        public let platformArn: String?
        /// If specified, AWS Elastic Beanstalk restricts the described events to include only those associated with this request ID.
        public let requestId: String?
        /// If specified, limits the events returned from this call to include only those with the specified severity or higher.
        public let severity: EventSeverity?
        /// If specified, AWS Elastic Beanstalk restricts the returned descriptions to those that occur on or after this time.
        public let startTime: Date?
        /// If specified, AWS Elastic Beanstalk restricts the returned descriptions to those that are associated with this environment configuration.
        public let templateName: String?
        /// If specified, AWS Elastic Beanstalk restricts the returned descriptions to those associated with this application version.
        public let versionLabel: String?

        @inlinable
        public init(applicationName: String? = nil, endTime: Date? = nil, environmentId: String? = nil, environmentName: String? = nil, maxRecords: Int? = nil, nextToken: String? = nil, platformArn: String? = nil, requestId: String? = nil, severity: EventSeverity? = nil, startTime: Date? = nil, templateName: String? = nil, versionLabel: String? = nil) {
            self.applicationName = applicationName
            self.endTime = endTime
            self.environmentId = environmentId
            self.environmentName = environmentName
            self.maxRecords = maxRecords
            self.nextToken = nextToken
            self.platformArn = platformArn
            self.requestId = requestId
            self.severity = severity
            self.startTime = startTime
            self.templateName = templateName
            self.versionLabel = versionLabel
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationName, name: "applicationName", parent: name, max: 100)
            try self.validate(self.applicationName, name: "applicationName", parent: name, min: 1)
            try self.validate(self.environmentName, name: "environmentName", parent: name, max: 40)
            try self.validate(self.environmentName, name: "environmentName", parent: name, min: 4)
            try self.validate(self.maxRecords, name: "maxRecords", parent: name, max: 1000)
            try self.validate(self.maxRecords, name: "maxRecords", parent: name, min: 1)
            try self.validate(self.templateName, name: "templateName", parent: name, max: 100)
            try self.validate(self.templateName, name: "templateName", parent: name, min: 1)
            try self.validate(self.versionLabel, name: "versionLabel", parent: name, max: 100)
            try self.validate(self.versionLabel, name: "versionLabel", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case applicationName = "ApplicationName"
            case endTime = "EndTime"
            case environmentId = "EnvironmentId"
            case environmentName = "EnvironmentName"
            case maxRecords = "MaxRecords"
            case nextToken = "NextToken"
            case platformArn = "PlatformArn"
            case requestId = "RequestId"
            case severity = "Severity"
            case startTime = "StartTime"
            case templateName = "TemplateName"
            case versionLabel = "VersionLabel"
        }
    }

    public struct DescribeInstancesHealthRequest: AWSEncodableShape {
        /// Specifies the response elements you wish to receive. To retrieve all attributes, set to All. If no attribute names are specified, returns a list of instances.
        @OptionalCustomCoding<StandardArrayCoder<InstancesHealthAttribute>>
        public var attributeNames: [InstancesHealthAttribute]?
        /// Specify the AWS Elastic Beanstalk environment by ID.
        public let environmentId: String?
        /// Specify the AWS Elastic Beanstalk environment by name.
        public let environmentName: String?
        /// Specify the pagination token returned by a previous call.
        public let nextToken: String?

        @inlinable
        public init(attributeNames: [InstancesHealthAttribute]? = nil, environmentId: String? = nil, environmentName: String? = nil, nextToken: String? = nil) {
            self.attributeNames = attributeNames
            self.environmentId = environmentId
            self.environmentName = environmentName
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.environmentName, name: "environmentName", parent: name, max: 40)
            try self.validate(self.environmentName, name: "environmentName", parent: name, min: 4)
            try self.validate(self.nextToken, name: "nextToken", parent: name, max: 100)
            try self.validate(self.nextToken, name: "nextToken", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case attributeNames = "AttributeNames"
            case environmentId = "EnvironmentId"
            case environmentName = "EnvironmentName"
            case nextToken = "NextToken"
        }
    }

    public struct DescribeInstancesHealthResult: AWSDecodableShape {
        /// Detailed health information about each instance. The output differs slightly between Linux and Windows environments. There is a difference in the members that are supported under the  type.
        @OptionalCustomCoding<StandardArrayCoder<SingleInstanceHealth>>
        public var instanceHealthList: [SingleInstanceHealth]?
        /// Pagination token for the next page of results, if available.
        public let nextToken: String?
        /// The date and time that the health information was retrieved.
        public let refreshedAt: Date?

        @inlinable
        public init(instanceHealthList: [SingleInstanceHealth]? = nil, nextToken: String? = nil, refreshedAt: Date? = nil) {
            self.instanceHealthList = instanceHealthList
            self.nextToken = nextToken
            self.refreshedAt = refreshedAt
        }

        private enum CodingKeys: String, CodingKey {
            case instanceHealthList = "InstanceHealthList"
            case nextToken = "NextToken"
            case refreshedAt = "RefreshedAt"
        }
    }

    public struct DescribePlatformVersionRequest: AWSEncodableShape {
        /// The ARN of the platform version.
        public let platformArn: String?

        @inlinable
        public init(platformArn: String? = nil) {
            self.platformArn = platformArn
        }

        private enum CodingKeys: String, CodingKey {
            case platformArn = "PlatformArn"
        }
    }

    public struct DescribePlatformVersionResult: AWSDecodableShape {
        /// Detailed information about the platform version.
        public let platformDescription: PlatformDescription?

        @inlinable
        public init(platformDescription: PlatformDescription? = nil) {
            self.platformDescription = platformDescription
        }

        private enum CodingKeys: String, CodingKey {
            case platformDescription = "PlatformDescription"
        }
    }

    public struct DisassociateEnvironmentOperationsRoleMessage: AWSEncodableShape {
        /// The name of the environment from which to disassociate the operations role.
        public let environmentName: String

        @inlinable
        public init(environmentName: String) {
            self.environmentName = environmentName
        }

        public func validate(name: String) throws {
            try self.validate(self.environmentName, name: "environmentName", parent: name, max: 40)
            try self.validate(self.environmentName, name: "environmentName", parent: name, min: 4)
        }

        private enum CodingKeys: String, CodingKey {
            case environmentName = "EnvironmentName"
        }
    }

    public struct EnvironmentDescription: AWSDecodableShape {
        /// Indicates if there is an in-progress environment configuration update or application version deployment that you can cancel.  true: There is an update in progress.   false: There are no updates currently in progress.
        public let abortableOperationInProgress: Bool?
        /// The name of the application associated with this environment.
        public let applicationName: String?
        /// The URL to the CNAME for this environment.
        public let cname: String?
        /// The creation date for this environment.
        public let dateCreated: Date?
        /// The last modified date for this environment.
        public let dateUpdated: Date?
        /// Describes this environment.
        public let description: String?
        /// For load-balanced, autoscaling environments, the URL to the LoadBalancer. For single-instance environments, the IP address of the instance.
        public let endpointURL: String?
        /// The environment's Amazon Resource Name (ARN), which can be used in other API requests that require an ARN.
        public let environmentArn: String?
        /// The ID of this environment.
        public let environmentId: String?
        /// A list of links to other environments in the same group.
        @OptionalCustomCoding<StandardArrayCoder<EnvironmentLink>>
        public var environmentLinks: [EnvironmentLink]?
        /// The name of this environment.
        public let environmentName: String?
        /// Describes the health status of the environment. AWS Elastic Beanstalk indicates the failure levels for a running environment:    Red: Indicates the environment is not responsive. Occurs when three or more consecutive failures occur for an environment.    Yellow: Indicates that something is wrong. Occurs when two consecutive failures occur for an environment.    Green: Indicates the environment is healthy and fully functional.    Grey: Default health for a new environment. The environment is not fully launched and health checks have not started or health checks are suspended during an UpdateEnvironment or RestartEnvironment request.   Default: Grey
        public let health: EnvironmentHealth?
        /// Returns the health status of the application running in your environment. For more information, see Health Colors and Statuses.
        public let healthStatus: EnvironmentHealthStatus?
        /// The Amazon Resource Name (ARN) of the environment's operations role. For more information, see Operations roles in the AWS Elastic Beanstalk Developer Guide.
        public let operationsRole: String?
        /// The ARN of the platform version.
        public let platformArn: String?
        /// The description of the AWS resources used by this environment.
        public let resources: EnvironmentResourcesDescription?
        ///  The name of the SolutionStack deployed with this environment.
        public let solutionStackName: String?
        /// The current operational status of the environment:    Launching: Environment is in the process of initial deployment.    Updating: Environment is in the process of updating its configuration settings or application version.    Ready: Environment is available to have an action performed on it, such as update or terminate.    Terminating: Environment is in the shut-down process.    Terminated: Environment is not running.
        public let status: EnvironmentStatus?
        /// The name of the configuration template used to originally launch this environment.
        public let templateName: String?
        /// Describes the current tier of this environment.
        public let tier: EnvironmentTier?
        /// The application version deployed in this environment.
        public let versionLabel: String?

        @inlinable
        public init(abortableOperationInProgress: Bool? = nil, applicationName: String? = nil, cname: String? = nil, dateCreated: Date? = nil, dateUpdated: Date? = nil, description: String? = nil, endpointURL: String? = nil, environmentArn: String? = nil, environmentId: String? = nil, environmentLinks: [EnvironmentLink]? = nil, environmentName: String? = nil, health: EnvironmentHealth? = nil, healthStatus: EnvironmentHealthStatus? = nil, operationsRole: String? = nil, platformArn: String? = nil, resources: EnvironmentResourcesDescription? = nil, solutionStackName: String? = nil, status: EnvironmentStatus? = nil, templateName: String? = nil, tier: EnvironmentTier? = nil, versionLabel: String? = nil) {
            self.abortableOperationInProgress = abortableOperationInProgress
            self.applicationName = applicationName
            self.cname = cname
            self.dateCreated = dateCreated
            self.dateUpdated = dateUpdated
            self.description = description
            self.endpointURL = endpointURL
            self.environmentArn = environmentArn
            self.environmentId = environmentId
            self.environmentLinks = environmentLinks
            self.environmentName = environmentName
            self.health = health
            self.healthStatus = healthStatus
            self.operationsRole = operationsRole
            self.platformArn = platformArn
            self.resources = resources
            self.solutionStackName = solutionStackName
            self.status = status
            self.templateName = templateName
            self.tier = tier
            self.versionLabel = versionLabel
        }

        private enum CodingKeys: String, CodingKey {
            case abortableOperationInProgress = "AbortableOperationInProgress"
            case applicationName = "ApplicationName"
            case cname = "CNAME"
            case dateCreated = "DateCreated"
            case dateUpdated = "DateUpdated"
            case description = "Description"
            case endpointURL = "EndpointURL"
            case environmentArn = "EnvironmentArn"
            case environmentId = "EnvironmentId"
            case environmentLinks = "EnvironmentLinks"
            case environmentName = "EnvironmentName"
            case health = "Health"
            case healthStatus = "HealthStatus"
            case operationsRole = "OperationsRole"
            case platformArn = "PlatformArn"
            case resources = "Resources"
            case solutionStackName = "SolutionStackName"
            case status = "Status"
            case templateName = "TemplateName"
            case tier = "Tier"
            case versionLabel = "VersionLabel"
        }
    }

    public struct EnvironmentDescriptionsMessage: AWSDecodableShape {
        ///  Returns an EnvironmentDescription list.
        @OptionalCustomCoding<StandardArrayCoder<EnvironmentDescription>>
        public var environments: [EnvironmentDescription]?
        /// In a paginated request, the token that you can pass in a subsequent request to get the next response page.
        public let nextToken: String?

        @inlinable
        public init(environments: [EnvironmentDescription]? = nil, nextToken: String? = nil) {
            self.environments = environments
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case environments = "Environments"
            case nextToken = "NextToken"
        }
    }

    public struct EnvironmentInfoDescription: AWSDecodableShape {
        /// The Amazon EC2 Instance ID for this information.
        public let ec2InstanceId: String?
        /// The type of information retrieved.
        public let infoType: EnvironmentInfoType?
        /// The retrieved information. Currently contains a presigned Amazon S3 URL. The files are deleted after 15 minutes. Anyone in possession of this URL can access the files before they are deleted. Make the URL available only to trusted parties.
        public let message: String?
        /// The time stamp when this information was retrieved.
        public let sampleTimestamp: Date?

        @inlinable
        public init(ec2InstanceId: String? = nil, infoType: EnvironmentInfoType? = nil, message: String? = nil, sampleTimestamp: Date? = nil) {
            self.ec2InstanceId = ec2InstanceId
            self.infoType = infoType
            self.message = message
            self.sampleTimestamp = sampleTimestamp
        }

        private enum CodingKeys: String, CodingKey {
            case ec2InstanceId = "Ec2InstanceId"
            case infoType = "InfoType"
            case message = "Message"
            case sampleTimestamp = "SampleTimestamp"
        }
    }

    public struct EnvironmentLink: AWSDecodableShape {
        /// The name of the linked environment (the dependency).
        public let environmentName: String?
        /// The name of the link.
        public let linkName: String?

        @inlinable
        public init(environmentName: String? = nil, linkName: String? = nil) {
            self.environmentName = environmentName
            self.linkName = linkName
        }

        private enum CodingKeys: String, CodingKey {
            case environmentName = "EnvironmentName"
            case linkName = "LinkName"
        }
    }

    public struct EnvironmentResourceDescription: AWSDecodableShape {
        ///  The AutoScalingGroups used by this environment.
        @OptionalCustomCoding<StandardArrayCoder<AutoScalingGroup>>
        public var autoScalingGroups: [AutoScalingGroup]?
        /// The name of the environment.
        public let environmentName: String?
        /// The Amazon EC2 instances used by this environment.
        @OptionalCustomCoding<StandardArrayCoder<Instance>>
        public var instances: [Instance]?
        /// The Auto Scaling launch configurations in use by this environment.
        @OptionalCustomCoding<StandardArrayCoder<LaunchConfiguration>>
        public var launchConfigurations: [LaunchConfiguration]?
        /// The Amazon EC2 launch templates in use by this environment.
        @OptionalCustomCoding<StandardArrayCoder<LaunchTemplate>>
        public var launchTemplates: [LaunchTemplate]?
        /// The LoadBalancers in use by this environment.
        @OptionalCustomCoding<StandardArrayCoder<LoadBalancer>>
        public var loadBalancers: [LoadBalancer]?
        /// The queues used by this environment.
        @OptionalCustomCoding<StandardArrayCoder<Queue>>
        public var queues: [Queue]?
        /// The AutoScaling triggers in use by this environment.
        @OptionalCustomCoding<StandardArrayCoder<Trigger>>
        public var triggers: [Trigger]?

        @inlinable
        public init(autoScalingGroups: [AutoScalingGroup]? = nil, environmentName: String? = nil, instances: [Instance]? = nil, launchConfigurations: [LaunchConfiguration]? = nil, launchTemplates: [LaunchTemplate]? = nil, loadBalancers: [LoadBalancer]? = nil, queues: [Queue]? = nil, triggers: [Trigger]? = nil) {
            self.autoScalingGroups = autoScalingGroups
            self.environmentName = environmentName
            self.instances = instances
            self.launchConfigurations = launchConfigurations
            self.launchTemplates = launchTemplates
            self.loadBalancers = loadBalancers
            self.queues = queues
            self.triggers = triggers
        }

        private enum CodingKeys: String, CodingKey {
            case autoScalingGroups = "AutoScalingGroups"
            case environmentName = "EnvironmentName"
            case instances = "Instances"
            case launchConfigurations = "LaunchConfigurations"
            case launchTemplates = "LaunchTemplates"
            case loadBalancers = "LoadBalancers"
            case queues = "Queues"
            case triggers = "Triggers"
        }
    }

    public struct EnvironmentResourceDescriptionsMessage: AWSDecodableShape {
        ///  A list of EnvironmentResourceDescription.
        public let environmentResources: EnvironmentResourceDescription?

        @inlinable
        public init(environmentResources: EnvironmentResourceDescription? = nil) {
            self.environmentResources = environmentResources
        }

        private enum CodingKeys: String, CodingKey {
            case environmentResources = "EnvironmentResources"
        }
    }

    public struct EnvironmentResourcesDescription: AWSDecodableShape {
        /// Describes the LoadBalancer.
        public let loadBalancer: LoadBalancerDescription?

        @inlinable
        public init(loadBalancer: LoadBalancerDescription? = nil) {
            self.loadBalancer = loadBalancer
        }

        private enum CodingKeys: String, CodingKey {
            case loadBalancer = "LoadBalancer"
        }
    }

    public struct EnvironmentTier: AWSEncodableShape & AWSDecodableShape {
        /// The name of this environment tier. Valid values:   For Web server tier – WebServer    For Worker tier – Worker
        public let name: String?
        /// The type of this environment tier. Valid values:   For Web server tier – Standard    For Worker tier – SQS/HTTP
        public let type: String?
        /// The version of this environment tier. When you don't set a value to it, Elastic Beanstalk uses the latest compatible worker tier version.  This member is deprecated. Any specific version that you set may become out of date. We recommend leaving it unspecified.
        public let version: String?

        @inlinable
        public init(name: String? = nil, type: String? = nil, version: String? = nil) {
            self.name = name
            self.type = type
            self.version = version
        }

        private enum CodingKeys: String, CodingKey {
            case name = "Name"
            case type = "Type"
            case version = "Version"
        }
    }

    public struct EventDescription: AWSDecodableShape {
        /// The application associated with the event.
        public let applicationName: String?
        /// The name of the environment associated with this event.
        public let environmentName: String?
        /// The date when the event occurred.
        public let eventDate: Date?
        /// The event message.
        public let message: String?
        /// The ARN of the platform version.
        public let platformArn: String?
        /// The web service request ID for the activity of this event.
        public let requestId: String?
        /// The severity level of this event.
        public let severity: EventSeverity?
        /// The name of the configuration associated with this event.
        public let templateName: String?
        /// The release label for the application version associated with this event.
        public let versionLabel: String?

        @inlinable
        public init(applicationName: String? = nil, environmentName: String? = nil, eventDate: Date? = nil, message: String? = nil, platformArn: String? = nil, requestId: String? = nil, severity: EventSeverity? = nil, templateName: String? = nil, versionLabel: String? = nil) {
            self.applicationName = applicationName
            self.environmentName = environmentName
            self.eventDate = eventDate
            self.message = message
            self.platformArn = platformArn
            self.requestId = requestId
            self.severity = severity
            self.templateName = templateName
            self.versionLabel = versionLabel
        }

        private enum CodingKeys: String, CodingKey {
            case applicationName = "ApplicationName"
            case environmentName = "EnvironmentName"
            case eventDate = "EventDate"
            case message = "Message"
            case platformArn = "PlatformArn"
            case requestId = "RequestId"
            case severity = "Severity"
            case templateName = "TemplateName"
            case versionLabel = "VersionLabel"
        }
    }

    public struct EventDescriptionsMessage: AWSDecodableShape {
        ///  A list of EventDescription.
        @OptionalCustomCoding<StandardArrayCoder<EventDescription>>
        public var events: [EventDescription]?
        ///  If returned, this indicates that there are more results to obtain. Use this token in the next DescribeEvents call to get the next batch of events.
        public let nextToken: String?

        @inlinable
        public init(events: [EventDescription]? = nil, nextToken: String? = nil) {
            self.events = events
            self.nextToken = nextToken
        }

        private enum CodingKeys: String, CodingKey {
            case events = "Events"
            case nextToken = "NextToken"
        }
    }

    public struct Instance: AWSDecodableShape {
        /// The ID of the Amazon EC2 instance.
        public let id: String?

        @inlinable
        public init(id: String? = nil) {
            self.id = id
        }

        private enum CodingKeys: String, CodingKey {
            case id = "Id"
        }
    }

    public struct InstanceHealthSummary: AWSDecodableShape {
        ///  Red. The health agent is reporting a high number of request failures or other issues for an instance or environment.
        public let degraded: Int?
        ///  Green. An operation is in progress on an instance.
        public let info: Int?
        ///  Grey. AWS Elastic Beanstalk and the health agent are reporting no data on an instance.
        public let noData: Int?
        ///  Green. An instance is passing health checks and the health agent is not reporting any problems.
        public let ok: Int?
        ///  Grey. An operation is in progress on an instance within the command timeout.
        public let pending: Int?
        ///  Red. The health agent is reporting a very high number of request failures or other issues for an instance or environment.
        public let severe: Int?
        ///  Grey. AWS Elastic Beanstalk and the health agent are reporting an insufficient amount of data on an instance.
        public let unknown: Int?
        ///  Yellow. The health agent is reporting a moderate number of request failures or other issues for an instance or environment.
        public let warning: Int?

        @inlinable
        public init(degraded: Int? = nil, info: Int? = nil, noData: Int? = nil, ok: Int? = nil, pending: Int? = nil, severe: Int? = nil, unknown: Int? = nil, warning: Int? = nil) {
            self.degraded = degraded
            self.info = info
            self.noData = noData
            self.ok = ok
            self.pending = pending
            self.severe = severe
            self.unknown = unknown
            self.warning = warning
        }

        private enum CodingKeys: String, CodingKey {
            case degraded = "Degraded"
            case info = "Info"
            case noData = "NoData"
            case ok = "Ok"
            case pending = "Pending"
            case severe = "Severe"
            case unknown = "Unknown"
            case warning = "Warning"
        }
    }

    public struct Latency: AWSDecodableShape {
        /// The average latency for the slowest 90 percent of requests over the last 10 seconds.
        public let p10: Double?
        /// The average latency for the slowest 50 percent of requests over the last 10 seconds.
        public let p50: Double?
        /// The average latency for the slowest 25 percent of requests over the last 10 seconds.
        public let p75: Double?
        /// The average latency for the slowest 15 percent of requests over the last 10 seconds.
        public let p85: Double?
        /// The average latency for the slowest 10 percent of requests over the last 10 seconds.
        public let p90: Double?
        /// The average latency for the slowest 5 percent of requests over the last 10 seconds.
        public let p95: Double?
        /// The average latency for the slowest 1 percent of requests over the last 10 seconds.
        public let p99: Double?
        /// The average latency for the slowest 0.1 percent of requests over the last 10 seconds.
        public let p999: Double?

        @inlinable
        public init(p10: Double? = nil, p50: Double? = nil, p75: Double? = nil, p85: Double? = nil, p90: Double? = nil, p95: Double? = nil, p99: Double? = nil, p999: Double? = nil) {
            self.p10 = p10
            self.p50 = p50
            self.p75 = p75
            self.p85 = p85
            self.p90 = p90
            self.p95 = p95
            self.p99 = p99
            self.p999 = p999
        }

        private enum CodingKeys: String, CodingKey {
            case p10 = "P10"
            case p50 = "P50"
            case p75 = "P75"
            case p85 = "P85"
            case p90 = "P90"
            case p95 = "P95"
            case p99 = "P99"
            case p999 = "P999"
        }
    }

    public struct LaunchConfiguration: AWSDecodableShape {
        /// The name of the launch configuration.
        public let name: String?

        @inlinable
        public init(name: String? = nil) {
            self.name = name
        }

        private enum CodingKeys: String, CodingKey {
            case name = "Name"
        }
    }

    public struct LaunchTemplate: AWSDecodableShape {
        /// The ID of the launch template.
        public let id: String?

        @inlinable
        public init(id: String? = nil) {
            self.id = id
        }

        private enum CodingKeys: String, CodingKey {
            case id = "Id"
        }
    }

    public struct ListAvailableSolutionStacksResultMessage: AWSDecodableShape {
        ///  A list of available solution stacks and their SolutionStackDescription.
        @OptionalCustomCoding<StandardArrayCoder<SolutionStackDescription>>
        public var solutionStackDetails: [SolutionStackDescription]?
        /// A list of available solution stacks.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var solutionStacks: [String]?

        @inlinable
        public init(solutionStackDetails: [SolutionStackDescription]? = nil, solutionStacks: [String]? = nil) {
            self.solutionStackDetails = solutionStackDetails
            self.solutionStacks = solutionStacks
        }

        private enum CodingKeys: String, CodingKey {
            case solutionStackDetails = "SolutionStackDetails"
            case solutionStacks = "SolutionStacks"
        }
    }

    public struct ListPlatformBranchesRequest: AWSEncodableShape {
        /// Criteria for restricting the resulting list of platform branches. The filter is evaluated as a logical conjunction (AND) of the separate SearchFilter terms. The following list shows valid attribute values for each of the SearchFilter terms. Most operators take a single value. The in and not_in operators can take multiple values.    Attribute = BranchName:    Operator: = | != | begins_with | ends_with | contains | in | not_in       Attribute = LifecycleState:    Operator: = | != | in | not_in     Values: beta | supported | deprecated | retired       Attribute = PlatformName:    Operator: = | != | begins_with | ends_with | contains | in | not_in       Attribute = TierType:    Operator: = | !=     Values: WebServer/Standard | Worker/SQS/HTTP      Array size: limited to 10 SearchFilter objects. Within each SearchFilter item, the Values array is limited to 10 items.
        @OptionalCustomCoding<StandardArrayCoder<SearchFilter>>
        public var filters: [SearchFilter]?
        /// The maximum number of platform branch values returned in one call.
        public let maxRecords: Int?
        /// For a paginated request. Specify a token from a previous response page to retrieve the next response page. All other parameter values must be identical to the ones specified in the initial request. If no NextToken is specified, the first page is retrieved.
        public let nextToken: String?

        @inlinable
        public init(filters: [SearchFilter]? = nil, maxRecords: Int? = nil, nextToken: String? = nil) {
            self.filters = filters
            self.maxRecords = maxRecords
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.maxRecords, name: "maxRecords", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case maxRecords = "MaxRecords"
            case nextToken = "NextToken"
        }
    }

    public struct ListPlatformBranchesResult: AWSDecodableShape {
        /// In a paginated request, if this value isn't null, it's the token that you can pass in a subsequent request to get the next response page.
        public let nextToken: String?
        /// Summary information about the platform branches.
        @OptionalCustomCoding<StandardArrayCoder<PlatformBranchSummary>>
        public var platformBranchSummaryList: [PlatformBranchSummary]?

        @inlinable
        public init(nextToken: String? = nil, platformBranchSummaryList: [PlatformBranchSummary]? = nil) {
            self.nextToken = nextToken
            self.platformBranchSummaryList = platformBranchSummaryList
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case platformBranchSummaryList = "PlatformBranchSummaryList"
        }
    }

    public struct ListPlatformVersionsRequest: AWSEncodableShape {
        /// Criteria for restricting the resulting list of platform versions. The filter is interpreted as a logical conjunction (AND) of the separate PlatformFilter terms.
        @OptionalCustomCoding<StandardArrayCoder<PlatformFilter>>
        public var filters: [PlatformFilter]?
        /// The maximum number of platform version values returned in one call.
        public let maxRecords: Int?
        /// For a paginated request. Specify a token from a previous response page to retrieve the next response page. All other parameter values must be identical to the ones specified in the initial request. If no NextToken is specified, the first page is retrieved.
        public let nextToken: String?

        @inlinable
        public init(filters: [PlatformFilter]? = nil, maxRecords: Int? = nil, nextToken: String? = nil) {
            self.filters = filters
            self.maxRecords = maxRecords
            self.nextToken = nextToken
        }

        public func validate(name: String) throws {
            try self.validate(self.maxRecords, name: "maxRecords", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case filters = "Filters"
            case maxRecords = "MaxRecords"
            case nextToken = "NextToken"
        }
    }

    public struct ListPlatformVersionsResult: AWSDecodableShape {
        /// In a paginated request, if this value isn't null, it's the token that you can pass in a subsequent request to get the next response page.
        public let nextToken: String?
        /// Summary information about the platform versions.
        @OptionalCustomCoding<StandardArrayCoder<PlatformSummary>>
        public var platformSummaryList: [PlatformSummary]?

        @inlinable
        public init(nextToken: String? = nil, platformSummaryList: [PlatformSummary]? = nil) {
            self.nextToken = nextToken
            self.platformSummaryList = platformSummaryList
        }

        private enum CodingKeys: String, CodingKey {
            case nextToken = "NextToken"
            case platformSummaryList = "PlatformSummaryList"
        }
    }

    public struct ListTagsForResourceMessage: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the resouce for which a tag list is requested. Must be the ARN of an Elastic Beanstalk resource.
        public let resourceArn: String

        @inlinable
        public init(resourceArn: String) {
            self.resourceArn = resourceArn
        }

        private enum CodingKeys: String, CodingKey {
            case resourceArn = "ResourceArn"
        }
    }

    public struct Listener: AWSDecodableShape {
        /// The port that is used by the Listener.
        public let port: Int?
        /// The protocol that is used by the Listener.
        public let `protocol`: String?

        @inlinable
        public init(port: Int? = nil, protocol: String? = nil) {
            self.port = port
            self.`protocol` = `protocol`
        }

        private enum CodingKeys: String, CodingKey {
            case port = "Port"
            case `protocol` = "Protocol"
        }
    }

    public struct LoadBalancer: AWSDecodableShape {
        /// The name of the LoadBalancer.
        public let name: String?

        @inlinable
        public init(name: String? = nil) {
            self.name = name
        }

        private enum CodingKeys: String, CodingKey {
            case name = "Name"
        }
    }

    public struct LoadBalancerDescription: AWSDecodableShape {
        /// The domain name of the LoadBalancer.
        public let domain: String?
        /// A list of Listeners used by the LoadBalancer.
        @OptionalCustomCoding<StandardArrayCoder<Listener>>
        public var listeners: [Listener]?
        /// The name of the LoadBalancer.
        public let loadBalancerName: String?

        @inlinable
        public init(domain: String? = nil, listeners: [Listener]? = nil, loadBalancerName: String? = nil) {
            self.domain = domain
            self.listeners = listeners
            self.loadBalancerName = loadBalancerName
        }

        private enum CodingKeys: String, CodingKey {
            case domain = "Domain"
            case listeners = "Listeners"
            case loadBalancerName = "LoadBalancerName"
        }
    }

    public struct ManagedAction: AWSDecodableShape {
        /// A description of the managed action.
        public let actionDescription: String?
        /// A unique identifier for the managed action.
        public let actionId: String?
        /// The type of managed action.
        public let actionType: ActionType?
        /// The status of the managed action. If the action is Scheduled, you can apply it immediately with ApplyEnvironmentManagedAction.
        public let status: ActionStatus?
        /// The start time of the maintenance window in which the managed action will execute.
        public let windowStartTime: Date?

        @inlinable
        public init(actionDescription: String? = nil, actionId: String? = nil, actionType: ActionType? = nil, status: ActionStatus? = nil, windowStartTime: Date? = nil) {
            self.actionDescription = actionDescription
            self.actionId = actionId
            self.actionType = actionType
            self.status = status
            self.windowStartTime = windowStartTime
        }

        private enum CodingKeys: String, CodingKey {
            case actionDescription = "ActionDescription"
            case actionId = "ActionId"
            case actionType = "ActionType"
            case status = "Status"
            case windowStartTime = "WindowStartTime"
        }
    }

    public struct ManagedActionHistoryItem: AWSDecodableShape {
        /// A description of the managed action.
        public let actionDescription: String?
        /// A unique identifier for the managed action.
        public let actionId: String?
        /// The type of the managed action.
        public let actionType: ActionType?
        /// The date and time that the action started executing.
        public let executedTime: Date?
        /// If the action failed, a description of the failure.
        public let failureDescription: String?
        /// If the action failed, the type of failure.
        public let failureType: FailureType?
        /// The date and time that the action finished executing.
        public let finishedTime: Date?
        /// The status of the action.
        public let status: ActionHistoryStatus?

        @inlinable
        public init(actionDescription: String? = nil, actionId: String? = nil, actionType: ActionType? = nil, executedTime: Date? = nil, failureDescription: String? = nil, failureType: FailureType? = nil, finishedTime: Date? = nil, status: ActionHistoryStatus? = nil) {
            self.actionDescription = actionDescription
            self.actionId = actionId
            self.actionType = actionType
            self.executedTime = executedTime
            self.failureDescription = failureDescription
            self.failureType = failureType
            self.finishedTime = finishedTime
            self.status = status
        }

        private enum CodingKeys: String, CodingKey {
            case actionDescription = "ActionDescription"
            case actionId = "ActionId"
            case actionType = "ActionType"
            case executedTime = "ExecutedTime"
            case failureDescription = "FailureDescription"
            case failureType = "FailureType"
            case finishedTime = "FinishedTime"
            case status = "Status"
        }
    }

    public struct MaxAgeRule: AWSEncodableShape & AWSDecodableShape {
        /// Set to true to delete a version's source bundle from Amazon S3 when Elastic Beanstalk deletes the application version.
        public let deleteSourceFromS3: Bool?
        /// Specify true to apply the rule, or false to disable it.
        public let enabled: Bool
        /// Specify the number of days to retain an application versions.
        public let maxAgeInDays: Int?

        @inlinable
        public init(deleteSourceFromS3: Bool? = nil, enabled: Bool, maxAgeInDays: Int? = nil) {
            self.deleteSourceFromS3 = deleteSourceFromS3
            self.enabled = enabled
            self.maxAgeInDays = maxAgeInDays
        }

        private enum CodingKeys: String, CodingKey {
            case deleteSourceFromS3 = "DeleteSourceFromS3"
            case enabled = "Enabled"
            case maxAgeInDays = "MaxAgeInDays"
        }
    }

    public struct MaxCountRule: AWSEncodableShape & AWSDecodableShape {
        /// Set to true to delete a version's source bundle from Amazon S3 when Elastic Beanstalk deletes the application version.
        public let deleteSourceFromS3: Bool?
        /// Specify true to apply the rule, or false to disable it.
        public let enabled: Bool
        /// Specify the maximum number of application versions to retain.
        public let maxCount: Int?

        @inlinable
        public init(deleteSourceFromS3: Bool? = nil, enabled: Bool, maxCount: Int? = nil) {
            self.deleteSourceFromS3 = deleteSourceFromS3
            self.enabled = enabled
            self.maxCount = maxCount
        }

        private enum CodingKeys: String, CodingKey {
            case deleteSourceFromS3 = "DeleteSourceFromS3"
            case enabled = "Enabled"
            case maxCount = "MaxCount"
        }
    }

    public struct OptionRestrictionRegex: AWSDecodableShape {
        /// A unique name representing this regular expression.
        public let label: String?
        /// The regular expression pattern that a string configuration option value with this restriction must match.
        public let pattern: String?

        @inlinable
        public init(label: String? = nil, pattern: String? = nil) {
            self.label = label
            self.pattern = pattern
        }

        private enum CodingKeys: String, CodingKey {
            case label = "Label"
            case pattern = "Pattern"
        }
    }

    public struct OptionSpecification: AWSEncodableShape {
        /// A unique namespace identifying the option's associated AWS resource.
        public let namespace: String?
        /// The name of the configuration option.
        public let optionName: String?
        /// A unique resource name for a time-based scaling configuration option.
        public let resourceName: String?

        @inlinable
        public init(namespace: String? = nil, optionName: String? = nil, resourceName: String? = nil) {
            self.namespace = namespace
            self.optionName = optionName
            self.resourceName = resourceName
        }

        public func validate(name: String) throws {
            try self.validate(self.resourceName, name: "resourceName", parent: name, max: 256)
            try self.validate(self.resourceName, name: "resourceName", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case namespace = "Namespace"
            case optionName = "OptionName"
            case resourceName = "ResourceName"
        }
    }

    public struct PlatformBranchSummary: AWSDecodableShape {
        /// The name of the platform branch.
        public let branchName: String?
        /// An ordinal number that designates the order in which platform branches have been added to a platform. This can be helpful, for example, if your code calls the ListPlatformBranches action and then displays a list of platform branches. A larger BranchOrder value designates a newer platform branch within the platform.
        public let branchOrder: Int?
        /// The support life cycle state of the platform branch. Possible values: beta | supported | deprecated |  retired
        public let lifecycleState: String?
        /// The name of the platform to which this platform branch belongs.
        public let platformName: String?
        /// The environment tiers that platform versions in this branch support. Possible values: WebServer/Standard | Worker/SQS/HTTP
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var supportedTierList: [String]?

        @inlinable
        public init(branchName: String? = nil, branchOrder: Int? = nil, lifecycleState: String? = nil, platformName: String? = nil, supportedTierList: [String]? = nil) {
            self.branchName = branchName
            self.branchOrder = branchOrder
            self.lifecycleState = lifecycleState
            self.platformName = platformName
            self.supportedTierList = supportedTierList
        }

        private enum CodingKeys: String, CodingKey {
            case branchName = "BranchName"
            case branchOrder = "BranchOrder"
            case lifecycleState = "LifecycleState"
            case platformName = "PlatformName"
            case supportedTierList = "SupportedTierList"
        }
    }

    public struct PlatformDescription: AWSDecodableShape {
        /// The custom AMIs supported by the platform version.
        @OptionalCustomCoding<StandardArrayCoder<CustomAmi>>
        public var customAmiList: [CustomAmi]?
        /// The date when the platform version was created.
        public let dateCreated: Date?
        /// The date when the platform version was last updated.
        public let dateUpdated: Date?
        /// The description of the platform version.
        public let description: String?
        /// The frameworks supported by the platform version.
        @OptionalCustomCoding<StandardArrayCoder<PlatformFramework>>
        public var frameworks: [PlatformFramework]?
        /// Information about the maintainer of the platform version.
        public let maintainer: String?
        /// The operating system used by the platform version.
        public let operatingSystemName: String?
        /// The version of the operating system used by the platform version.
        public let operatingSystemVersion: String?
        /// The ARN of the platform version.
        public let platformArn: String?
        /// The state of the platform version's branch in its lifecycle. Possible values: Beta | Supported | Deprecated | Retired
        public let platformBranchLifecycleState: String?
        /// The platform branch to which the platform version belongs.
        public let platformBranchName: String?
        /// The category of the platform version.
        public let platformCategory: String?
        /// The state of the platform version in its lifecycle. Possible values: Recommended | null  If a null value is returned, the platform version isn't the recommended one for its branch. Each platform branch has a single recommended platform version, typically the most recent one.
        public let platformLifecycleState: String?
        /// The name of the platform version.
        public let platformName: String?
        /// The AWS account ID of the person who created the platform version.
        public let platformOwner: String?
        /// The status of the platform version.
        public let platformStatus: PlatformStatus?
        /// The version of the platform version.
        public let platformVersion: String?
        /// The programming languages supported by the platform version.
        @OptionalCustomCoding<StandardArrayCoder<PlatformProgrammingLanguage>>
        public var programmingLanguages: [PlatformProgrammingLanguage]?
        /// The name of the solution stack used by the platform version.
        public let solutionStackName: String?
        /// The additions supported by the platform version.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var supportedAddonList: [String]?
        /// The tiers supported by the platform version.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var supportedTierList: [String]?

        @inlinable
        public init(customAmiList: [CustomAmi]? = nil, dateCreated: Date? = nil, dateUpdated: Date? = nil, description: String? = nil, frameworks: [PlatformFramework]? = nil, maintainer: String? = nil, operatingSystemName: String? = nil, operatingSystemVersion: String? = nil, platformArn: String? = nil, platformBranchLifecycleState: String? = nil, platformBranchName: String? = nil, platformCategory: String? = nil, platformLifecycleState: String? = nil, platformName: String? = nil, platformOwner: String? = nil, platformStatus: PlatformStatus? = nil, platformVersion: String? = nil, programmingLanguages: [PlatformProgrammingLanguage]? = nil, solutionStackName: String? = nil, supportedAddonList: [String]? = nil, supportedTierList: [String]? = nil) {
            self.customAmiList = customAmiList
            self.dateCreated = dateCreated
            self.dateUpdated = dateUpdated
            self.description = description
            self.frameworks = frameworks
            self.maintainer = maintainer
            self.operatingSystemName = operatingSystemName
            self.operatingSystemVersion = operatingSystemVersion
            self.platformArn = platformArn
            self.platformBranchLifecycleState = platformBranchLifecycleState
            self.platformBranchName = platformBranchName
            self.platformCategory = platformCategory
            self.platformLifecycleState = platformLifecycleState
            self.platformName = platformName
            self.platformOwner = platformOwner
            self.platformStatus = platformStatus
            self.platformVersion = platformVersion
            self.programmingLanguages = programmingLanguages
            self.solutionStackName = solutionStackName
            self.supportedAddonList = supportedAddonList
            self.supportedTierList = supportedTierList
        }

        private enum CodingKeys: String, CodingKey {
            case customAmiList = "CustomAmiList"
            case dateCreated = "DateCreated"
            case dateUpdated = "DateUpdated"
            case description = "Description"
            case frameworks = "Frameworks"
            case maintainer = "Maintainer"
            case operatingSystemName = "OperatingSystemName"
            case operatingSystemVersion = "OperatingSystemVersion"
            case platformArn = "PlatformArn"
            case platformBranchLifecycleState = "PlatformBranchLifecycleState"
            case platformBranchName = "PlatformBranchName"
            case platformCategory = "PlatformCategory"
            case platformLifecycleState = "PlatformLifecycleState"
            case platformName = "PlatformName"
            case platformOwner = "PlatformOwner"
            case platformStatus = "PlatformStatus"
            case platformVersion = "PlatformVersion"
            case programmingLanguages = "ProgrammingLanguages"
            case solutionStackName = "SolutionStackName"
            case supportedAddonList = "SupportedAddonList"
            case supportedTierList = "SupportedTierList"
        }
    }

    public struct PlatformFilter: AWSEncodableShape {
        /// The operator to apply to the Type with each of the Values. Valid values: = | != | |  | > | >= | contains | begins_with | ends_with
        public let `operator`: String?
        /// The platform version attribute to which the filter values are applied. Valid values: PlatformName | PlatformVersion | PlatformStatus | PlatformBranchName | PlatformLifecycleState | PlatformOwner | SupportedTier | SupportedAddon | ProgrammingLanguageName | OperatingSystemName
        public let type: String?
        /// The list of values applied to the filtering platform version attribute. Only one value is supported for all current operators. The following list shows valid filter values for some filter attributes.    PlatformStatus: Creating | Failed | Ready | Deleting | Deleted     PlatformLifecycleState: recommended     SupportedTier: WebServer/Standard | Worker/SQS/HTTP     SupportedAddon: Log/S3 | Monitoring/Healthd | WorkerDaemon/SQSD
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var values: [String]?

        @inlinable
        public init(operator: String? = nil, type: String? = nil, values: [String]? = nil) {
            self.`operator` = `operator`
            self.type = type
            self.values = values
        }

        private enum CodingKeys: String, CodingKey {
            case `operator` = "Operator"
            case type = "Type"
            case values = "Values"
        }
    }

    public struct PlatformFramework: AWSDecodableShape {
        /// The name of the framework.
        public let name: String?
        /// The version of the framework.
        public let version: String?

        @inlinable
        public init(name: String? = nil, version: String? = nil) {
            self.name = name
            self.version = version
        }

        private enum CodingKeys: String, CodingKey {
            case name = "Name"
            case version = "Version"
        }
    }

    public struct PlatformProgrammingLanguage: AWSDecodableShape {
        /// The name of the programming language.
        public let name: String?
        /// The version of the programming language.
        public let version: String?

        @inlinable
        public init(name: String? = nil, version: String? = nil) {
            self.name = name
            self.version = version
        }

        private enum CodingKeys: String, CodingKey {
            case name = "Name"
            case version = "Version"
        }
    }

    public struct PlatformSummary: AWSDecodableShape {
        /// The operating system used by the platform version.
        public let operatingSystemName: String?
        /// The version of the operating system used by the platform version.
        public let operatingSystemVersion: String?
        /// The ARN of the platform version.
        public let platformArn: String?
        /// The state of the platform version's branch in its lifecycle. Possible values: beta | supported | deprecated | retired
        public let platformBranchLifecycleState: String?
        /// The platform branch to which the platform version belongs.
        public let platformBranchName: String?
        /// The category of platform version.
        public let platformCategory: String?
        /// The state of the platform version in its lifecycle. Possible values: recommended | empty If an empty value is returned, the platform version is supported but isn't the recommended one for its branch.
        public let platformLifecycleState: String?
        /// The AWS account ID of the person who created the platform version.
        public let platformOwner: String?
        /// The status of the platform version. You can create an environment from the platform version once it is ready.
        public let platformStatus: PlatformStatus?
        /// The version string of the platform version.
        public let platformVersion: String?
        /// The additions associated with the platform version.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var supportedAddonList: [String]?
        /// The tiers in which the platform version runs.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var supportedTierList: [String]?

        @inlinable
        public init(operatingSystemName: String? = nil, operatingSystemVersion: String? = nil, platformArn: String? = nil, platformBranchLifecycleState: String? = nil, platformBranchName: String? = nil, platformCategory: String? = nil, platformLifecycleState: String? = nil, platformOwner: String? = nil, platformStatus: PlatformStatus? = nil, platformVersion: String? = nil, supportedAddonList: [String]? = nil, supportedTierList: [String]? = nil) {
            self.operatingSystemName = operatingSystemName
            self.operatingSystemVersion = operatingSystemVersion
            self.platformArn = platformArn
            self.platformBranchLifecycleState = platformBranchLifecycleState
            self.platformBranchName = platformBranchName
            self.platformCategory = platformCategory
            self.platformLifecycleState = platformLifecycleState
            self.platformOwner = platformOwner
            self.platformStatus = platformStatus
            self.platformVersion = platformVersion
            self.supportedAddonList = supportedAddonList
            self.supportedTierList = supportedTierList
        }

        private enum CodingKeys: String, CodingKey {
            case operatingSystemName = "OperatingSystemName"
            case operatingSystemVersion = "OperatingSystemVersion"
            case platformArn = "PlatformArn"
            case platformBranchLifecycleState = "PlatformBranchLifecycleState"
            case platformBranchName = "PlatformBranchName"
            case platformCategory = "PlatformCategory"
            case platformLifecycleState = "PlatformLifecycleState"
            case platformOwner = "PlatformOwner"
            case platformStatus = "PlatformStatus"
            case platformVersion = "PlatformVersion"
            case supportedAddonList = "SupportedAddonList"
            case supportedTierList = "SupportedTierList"
        }
    }

    public struct Queue: AWSDecodableShape {
        /// The name of the queue.
        public let name: String?
        /// The URL of the queue.
        public let url: String?

        @inlinable
        public init(name: String? = nil, url: String? = nil) {
            self.name = name
            self.url = url
        }

        private enum CodingKeys: String, CodingKey {
            case name = "Name"
            case url = "URL"
        }
    }

    public struct RebuildEnvironmentMessage: AWSEncodableShape {
        /// The ID of the environment to rebuild. Condition: You must specify either this or an EnvironmentName, or both. If you do not specify either, AWS Elastic Beanstalk returns MissingRequiredParameter error.
        public let environmentId: String?
        /// The name of the environment to rebuild. Condition: You must specify either this or an EnvironmentId, or both. If you do not specify either, AWS Elastic Beanstalk returns MissingRequiredParameter error.
        public let environmentName: String?

        @inlinable
        public init(environmentId: String? = nil, environmentName: String? = nil) {
            self.environmentId = environmentId
            self.environmentName = environmentName
        }

        public func validate(name: String) throws {
            try self.validate(self.environmentName, name: "environmentName", parent: name, max: 40)
            try self.validate(self.environmentName, name: "environmentName", parent: name, min: 4)
        }

        private enum CodingKeys: String, CodingKey {
            case environmentId = "EnvironmentId"
            case environmentName = "EnvironmentName"
        }
    }

    public struct RequestEnvironmentInfoMessage: AWSEncodableShape {
        /// The ID of the environment of the requested data. If no such environment is found, RequestEnvironmentInfo returns an InvalidParameterValue error.  Condition: You must specify either this or an EnvironmentName, or both. If you do not specify either, AWS Elastic Beanstalk returns MissingRequiredParameter error.
        public let environmentId: String?
        /// The name of the environment of the requested data. If no such environment is found, RequestEnvironmentInfo returns an InvalidParameterValue error.  Condition: You must specify either this or an EnvironmentId, or both. If you do not specify either, AWS Elastic Beanstalk returns MissingRequiredParameter error.
        public let environmentName: String?
        /// The type of information to request.
        public let infoType: EnvironmentInfoType

        @inlinable
        public init(environmentId: String? = nil, environmentName: String? = nil, infoType: EnvironmentInfoType) {
            self.environmentId = environmentId
            self.environmentName = environmentName
            self.infoType = infoType
        }

        public func validate(name: String) throws {
            try self.validate(self.environmentName, name: "environmentName", parent: name, max: 40)
            try self.validate(self.environmentName, name: "environmentName", parent: name, min: 4)
        }

        private enum CodingKeys: String, CodingKey {
            case environmentId = "EnvironmentId"
            case environmentName = "EnvironmentName"
            case infoType = "InfoType"
        }
    }

    public struct ResourceQuota: AWSDecodableShape {
        /// The maximum number of instances of this Elastic Beanstalk resource type that an AWS account can use.
        public let maximum: Int?

        @inlinable
        public init(maximum: Int? = nil) {
            self.maximum = maximum
        }

        private enum CodingKeys: String, CodingKey {
            case maximum = "Maximum"
        }
    }

    public struct ResourceQuotas: AWSDecodableShape {
        /// The quota for applications in the AWS account.
        public let applicationQuota: ResourceQuota?
        /// The quota for application versions in the AWS account.
        public let applicationVersionQuota: ResourceQuota?
        /// The quota for configuration templates in the AWS account.
        public let configurationTemplateQuota: ResourceQuota?
        /// The quota for custom platforms in the AWS account.
        public let customPlatformQuota: ResourceQuota?
        /// The quota for environments in the AWS account.
        public let environmentQuota: ResourceQuota?

        @inlinable
        public init(applicationQuota: ResourceQuota? = nil, applicationVersionQuota: ResourceQuota? = nil, configurationTemplateQuota: ResourceQuota? = nil, customPlatformQuota: ResourceQuota? = nil, environmentQuota: ResourceQuota? = nil) {
            self.applicationQuota = applicationQuota
            self.applicationVersionQuota = applicationVersionQuota
            self.configurationTemplateQuota = configurationTemplateQuota
            self.customPlatformQuota = customPlatformQuota
            self.environmentQuota = environmentQuota
        }

        private enum CodingKeys: String, CodingKey {
            case applicationQuota = "ApplicationQuota"
            case applicationVersionQuota = "ApplicationVersionQuota"
            case configurationTemplateQuota = "ConfigurationTemplateQuota"
            case customPlatformQuota = "CustomPlatformQuota"
            case environmentQuota = "EnvironmentQuota"
        }
    }

    public struct ResourceTagsDescriptionMessage: AWSDecodableShape {
        /// The Amazon Resource Name (ARN) of the resource for which a tag list was requested.
        public let resourceArn: String?
        /// A list of tag key-value pairs.
        @OptionalCustomCoding<StandardArrayCoder<Tag>>
        public var resourceTags: [Tag]?

        @inlinable
        public init(resourceArn: String? = nil, resourceTags: [Tag]? = nil) {
            self.resourceArn = resourceArn
            self.resourceTags = resourceTags
        }

        private enum CodingKeys: String, CodingKey {
            case resourceArn = "ResourceArn"
            case resourceTags = "ResourceTags"
        }
    }

    public struct RestartAppServerMessage: AWSEncodableShape {
        /// The ID of the environment to restart the server for. Condition: You must specify either this or an EnvironmentName, or both. If you do not specify either, AWS Elastic Beanstalk returns MissingRequiredParameter error.
        public let environmentId: String?
        /// The name of the environment to restart the server for. Condition: You must specify either this or an EnvironmentId, or both. If you do not specify either, AWS Elastic Beanstalk returns MissingRequiredParameter error.
        public let environmentName: String?

        @inlinable
        public init(environmentId: String? = nil, environmentName: String? = nil) {
            self.environmentId = environmentId
            self.environmentName = environmentName
        }

        public func validate(name: String) throws {
            try self.validate(self.environmentName, name: "environmentName", parent: name, max: 40)
            try self.validate(self.environmentName, name: "environmentName", parent: name, min: 4)
        }

        private enum CodingKeys: String, CodingKey {
            case environmentId = "EnvironmentId"
            case environmentName = "EnvironmentName"
        }
    }

    public struct RetrieveEnvironmentInfoMessage: AWSEncodableShape {
        /// The ID of the data's environment. If no such environment is found, returns an InvalidParameterValue error. Condition: You must specify either this or an EnvironmentName, or both. If you do not specify either, AWS Elastic Beanstalk returns MissingRequiredParameter error.
        public let environmentId: String?
        /// The name of the data's environment. If no such environment is found, returns an InvalidParameterValue error.  Condition: You must specify either this or an EnvironmentId, or both. If you do not specify either, AWS Elastic Beanstalk returns MissingRequiredParameter error.
        public let environmentName: String?
        /// The type of information to retrieve.
        public let infoType: EnvironmentInfoType

        @inlinable
        public init(environmentId: String? = nil, environmentName: String? = nil, infoType: EnvironmentInfoType) {
            self.environmentId = environmentId
            self.environmentName = environmentName
            self.infoType = infoType
        }

        public func validate(name: String) throws {
            try self.validate(self.environmentName, name: "environmentName", parent: name, max: 40)
            try self.validate(self.environmentName, name: "environmentName", parent: name, min: 4)
        }

        private enum CodingKeys: String, CodingKey {
            case environmentId = "EnvironmentId"
            case environmentName = "EnvironmentName"
            case infoType = "InfoType"
        }
    }

    public struct RetrieveEnvironmentInfoResultMessage: AWSDecodableShape {
        ///  The EnvironmentInfoDescription of the environment.
        @OptionalCustomCoding<StandardArrayCoder<EnvironmentInfoDescription>>
        public var environmentInfo: [EnvironmentInfoDescription]?

        @inlinable
        public init(environmentInfo: [EnvironmentInfoDescription]? = nil) {
            self.environmentInfo = environmentInfo
        }

        private enum CodingKeys: String, CodingKey {
            case environmentInfo = "EnvironmentInfo"
        }
    }

    public struct S3Location: AWSEncodableShape & AWSDecodableShape {
        /// The Amazon S3 bucket where the data is located.
        public let s3Bucket: String?
        /// The Amazon S3 key where the data is located.
        public let s3Key: String?

        @inlinable
        public init(s3Bucket: String? = nil, s3Key: String? = nil) {
            self.s3Bucket = s3Bucket
            self.s3Key = s3Key
        }

        public func validate(name: String) throws {
            try self.validate(self.s3Bucket, name: "s3Bucket", parent: name, max: 255)
            try self.validate(self.s3Key, name: "s3Key", parent: name, max: 1024)
        }

        private enum CodingKeys: String, CodingKey {
            case s3Bucket = "S3Bucket"
            case s3Key = "S3Key"
        }
    }

    public struct SearchFilter: AWSEncodableShape {
        /// The result attribute to which the filter values are applied. Valid values vary by API action.
        public let attribute: String?
        /// The operator to apply to the Attribute with each of the Values. Valid values vary by Attribute.
        public let `operator`: String?
        /// The list of values applied to the Attribute and Operator attributes. Number of values and valid values vary by Attribute.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var values: [String]?

        @inlinable
        public init(attribute: String? = nil, operator: String? = nil, values: [String]? = nil) {
            self.attribute = attribute
            self.`operator` = `operator`
            self.values = values
        }

        private enum CodingKeys: String, CodingKey {
            case attribute = "Attribute"
            case `operator` = "Operator"
            case values = "Values"
        }
    }

    public struct SingleInstanceHealth: AWSDecodableShape {
        /// Request metrics from your application.
        public let applicationMetrics: ApplicationMetrics?
        /// The availability zone in which the instance runs.
        public let availabilityZone: String?
        /// Represents the causes, which provide more information about the current health status.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var causes: [String]?
        /// Represents the color indicator that gives you information about the health of the EC2 instance. For more information, see Health Colors and Statuses.
        public let color: String?
        /// Information about the most recent deployment to an instance.
        public let deployment: Deployment?
        /// Returns the health status of the specified instance. For more information, see Health Colors and Statuses.
        public let healthStatus: String?
        /// The ID of the Amazon EC2 instance.
        public let instanceId: String?
        /// The instance's type.
        public let instanceType: String?
        /// The time at which the EC2 instance was launched.
        public let launchedAt: Date?
        /// Operating system metrics from the instance.
        public let system: SystemStatus?

        @inlinable
        public init(applicationMetrics: ApplicationMetrics? = nil, availabilityZone: String? = nil, causes: [String]? = nil, color: String? = nil, deployment: Deployment? = nil, healthStatus: String? = nil, instanceId: String? = nil, instanceType: String? = nil, launchedAt: Date? = nil, system: SystemStatus? = nil) {
            self.applicationMetrics = applicationMetrics
            self.availabilityZone = availabilityZone
            self.causes = causes
            self.color = color
            self.deployment = deployment
            self.healthStatus = healthStatus
            self.instanceId = instanceId
            self.instanceType = instanceType
            self.launchedAt = launchedAt
            self.system = system
        }

        private enum CodingKeys: String, CodingKey {
            case applicationMetrics = "ApplicationMetrics"
            case availabilityZone = "AvailabilityZone"
            case causes = "Causes"
            case color = "Color"
            case deployment = "Deployment"
            case healthStatus = "HealthStatus"
            case instanceId = "InstanceId"
            case instanceType = "InstanceType"
            case launchedAt = "LaunchedAt"
            case system = "System"
        }
    }

    public struct SolutionStackDescription: AWSDecodableShape {
        /// The permitted file types allowed for a solution stack.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var permittedFileTypes: [String]?
        /// The name of the solution stack.
        public let solutionStackName: String?

        @inlinable
        public init(permittedFileTypes: [String]? = nil, solutionStackName: String? = nil) {
            self.permittedFileTypes = permittedFileTypes
            self.solutionStackName = solutionStackName
        }

        private enum CodingKeys: String, CodingKey {
            case permittedFileTypes = "PermittedFileTypes"
            case solutionStackName = "SolutionStackName"
        }
    }

    public struct SourceBuildInformation: AWSEncodableShape & AWSDecodableShape {
        /// The location of the source code, as a formatted string, depending on the value of SourceRepository    For CodeCommit,
        /// 	the format is the repository name and commit ID, separated by a forward slash.
        /// 	For example,
        /// 	my-git-repo/265cfa0cf6af46153527f55d6503ec030551f57a.   For S3,
        /// 	the format is the S3 bucket name and object key, separated by a forward slash.
        /// 	For example,
        /// 	my-s3-bucket/Folders/my-source-file.
        public let sourceLocation: String
        /// Location where the repository is stored.    CodeCommit     S3
        public let sourceRepository: SourceRepository
        /// The type of repository.    Git     Zip
        public let sourceType: SourceType

        @inlinable
        public init(sourceLocation: String, sourceRepository: SourceRepository, sourceType: SourceType) {
            self.sourceLocation = sourceLocation
            self.sourceRepository = sourceRepository
            self.sourceType = sourceType
        }

        public func validate(name: String) throws {
            try self.validate(self.sourceLocation, name: "sourceLocation", parent: name, max: 255)
            try self.validate(self.sourceLocation, name: "sourceLocation", parent: name, min: 3)
            try self.validate(self.sourceLocation, name: "sourceLocation", parent: name, pattern: "^.+/.+$")
        }

        private enum CodingKeys: String, CodingKey {
            case sourceLocation = "SourceLocation"
            case sourceRepository = "SourceRepository"
            case sourceType = "SourceType"
        }
    }

    public struct SourceConfiguration: AWSEncodableShape {
        /// The name of the application associated with the configuration.
        public let applicationName: String?
        /// The name of the configuration template.
        public let templateName: String?

        @inlinable
        public init(applicationName: String? = nil, templateName: String? = nil) {
            self.applicationName = applicationName
            self.templateName = templateName
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationName, name: "applicationName", parent: name, max: 100)
            try self.validate(self.applicationName, name: "applicationName", parent: name, min: 1)
            try self.validate(self.templateName, name: "templateName", parent: name, max: 100)
            try self.validate(self.templateName, name: "templateName", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case applicationName = "ApplicationName"
            case templateName = "TemplateName"
        }
    }

    public struct StatusCodes: AWSDecodableShape {
        /// The percentage of requests over the last 10 seconds that resulted in a 2xx (200, 201, etc.) status code.
        public let status2xx: Int?
        /// The percentage of requests over the last 10 seconds that resulted in a 3xx (300, 301, etc.) status code.
        public let status3xx: Int?
        /// The percentage of requests over the last 10 seconds that resulted in a 4xx (400, 401, etc.) status code.
        public let status4xx: Int?
        /// The percentage of requests over the last 10 seconds that resulted in a 5xx (500, 501, etc.) status code.
        public let status5xx: Int?

        @inlinable
        public init(status2xx: Int? = nil, status3xx: Int? = nil, status4xx: Int? = nil, status5xx: Int? = nil) {
            self.status2xx = status2xx
            self.status3xx = status3xx
            self.status4xx = status4xx
            self.status5xx = status5xx
        }

        private enum CodingKeys: String, CodingKey {
            case status2xx = "Status2xx"
            case status3xx = "Status3xx"
            case status4xx = "Status4xx"
            case status5xx = "Status5xx"
        }
    }

    public struct SwapEnvironmentCNAMEsMessage: AWSEncodableShape {
        /// The ID of the destination environment. Condition: You must specify at least the DestinationEnvironmentID or the DestinationEnvironmentName. You may also specify both. You must specify the SourceEnvironmentId with the DestinationEnvironmentId.
        public let destinationEnvironmentId: String?
        /// The name of the destination environment. Condition: You must specify at least the DestinationEnvironmentID or the DestinationEnvironmentName. You may also specify both. You must specify the SourceEnvironmentName with the DestinationEnvironmentName.
        public let destinationEnvironmentName: String?
        /// The ID of the source environment. Condition: You must specify at least the SourceEnvironmentID or the SourceEnvironmentName. You may also specify both. If you specify the SourceEnvironmentId, you must specify the DestinationEnvironmentId.
        public let sourceEnvironmentId: String?
        /// The name of the source environment. Condition: You must specify at least the SourceEnvironmentID or the SourceEnvironmentName. You may also specify both. If you specify the SourceEnvironmentName, you must specify the DestinationEnvironmentName.
        public let sourceEnvironmentName: String?

        @inlinable
        public init(destinationEnvironmentId: String? = nil, destinationEnvironmentName: String? = nil, sourceEnvironmentId: String? = nil, sourceEnvironmentName: String? = nil) {
            self.destinationEnvironmentId = destinationEnvironmentId
            self.destinationEnvironmentName = destinationEnvironmentName
            self.sourceEnvironmentId = sourceEnvironmentId
            self.sourceEnvironmentName = sourceEnvironmentName
        }

        public func validate(name: String) throws {
            try self.validate(self.destinationEnvironmentName, name: "destinationEnvironmentName", parent: name, max: 40)
            try self.validate(self.destinationEnvironmentName, name: "destinationEnvironmentName", parent: name, min: 4)
            try self.validate(self.sourceEnvironmentName, name: "sourceEnvironmentName", parent: name, max: 40)
            try self.validate(self.sourceEnvironmentName, name: "sourceEnvironmentName", parent: name, min: 4)
        }

        private enum CodingKeys: String, CodingKey {
            case destinationEnvironmentId = "DestinationEnvironmentId"
            case destinationEnvironmentName = "DestinationEnvironmentName"
            case sourceEnvironmentId = "SourceEnvironmentId"
            case sourceEnvironmentName = "SourceEnvironmentName"
        }
    }

    public struct SystemStatus: AWSDecodableShape {
        /// CPU utilization metrics for the instance.
        public let cpuUtilization: CPUUtilization?
        /// Load average in the last 1-minute, 5-minute, and 15-minute periods.  For more information, see Operating System Metrics.
        @OptionalCustomCoding<StandardArrayCoder<Double>>
        public var loadAverage: [Double]?

        @inlinable
        public init(cpuUtilization: CPUUtilization? = nil, loadAverage: [Double]? = nil) {
            self.cpuUtilization = cpuUtilization
            self.loadAverage = loadAverage
        }

        private enum CodingKeys: String, CodingKey {
            case cpuUtilization = "CPUUtilization"
            case loadAverage = "LoadAverage"
        }
    }

    public struct Tag: AWSEncodableShape & AWSDecodableShape {
        /// The key of the tag.
        public let key: String?
        /// The value of the tag.
        public let value: String?

        @inlinable
        public init(key: String? = nil, value: String? = nil) {
            self.key = key
            self.value = value
        }

        public func validate(name: String) throws {
            try self.validate(self.key, name: "key", parent: name, max: 128)
            try self.validate(self.key, name: "key", parent: name, min: 1)
            try self.validate(self.value, name: "value", parent: name, max: 256)
            try self.validate(self.value, name: "value", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case key = "Key"
            case value = "Value"
        }
    }

    public struct TerminateEnvironmentMessage: AWSEncodableShape {
        /// The ID of the environment to terminate. Condition: You must specify either this or an EnvironmentName, or both. If you do not specify either, AWS Elastic Beanstalk returns MissingRequiredParameter error.
        public let environmentId: String?
        /// The name of the environment to terminate. Condition: You must specify either this or an EnvironmentId, or both. If you do not specify either, AWS Elastic Beanstalk returns MissingRequiredParameter error.
        public let environmentName: String?
        /// Terminates the target environment even if another environment in the same group is dependent on it.
        public let forceTerminate: Bool?
        /// Indicates whether the associated AWS resources should shut down when the environment is terminated:    true: The specified environment as well as the associated AWS resources, such as Auto Scaling group and LoadBalancer, are terminated.    false: AWS Elastic Beanstalk resource management is removed from the environment, but the AWS resources continue to operate.   For more information, see the  AWS Elastic Beanstalk User Guide.   Default: true  Valid Values: true | false
        public let terminateResources: Bool?

        @inlinable
        public init(environmentId: String? = nil, environmentName: String? = nil, forceTerminate: Bool? = nil, terminateResources: Bool? = nil) {
            self.environmentId = environmentId
            self.environmentName = environmentName
            self.forceTerminate = forceTerminate
            self.terminateResources = terminateResources
        }

        public func validate(name: String) throws {
            try self.validate(self.environmentName, name: "environmentName", parent: name, max: 40)
            try self.validate(self.environmentName, name: "environmentName", parent: name, min: 4)
        }

        private enum CodingKeys: String, CodingKey {
            case environmentId = "EnvironmentId"
            case environmentName = "EnvironmentName"
            case forceTerminate = "ForceTerminate"
            case terminateResources = "TerminateResources"
        }
    }

    public struct Trigger: AWSDecodableShape {
        /// The name of the trigger.
        public let name: String?

        @inlinable
        public init(name: String? = nil) {
            self.name = name
        }

        private enum CodingKeys: String, CodingKey {
            case name = "Name"
        }
    }

    public struct UpdateApplicationMessage: AWSEncodableShape {
        /// The name of the application to update. If no such application is found, UpdateApplication returns an InvalidParameterValue error.
        public let applicationName: String
        /// A new description for the application. Default: If not specified, AWS Elastic Beanstalk does not update the description.
        public let description: String?

        @inlinable
        public init(applicationName: String, description: String? = nil) {
            self.applicationName = applicationName
            self.description = description
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationName, name: "applicationName", parent: name, max: 100)
            try self.validate(self.applicationName, name: "applicationName", parent: name, min: 1)
            try self.validate(self.description, name: "description", parent: name, max: 200)
        }

        private enum CodingKeys: String, CodingKey {
            case applicationName = "ApplicationName"
            case description = "Description"
        }
    }

    public struct UpdateApplicationResourceLifecycleMessage: AWSEncodableShape {
        /// The name of the application.
        public let applicationName: String
        /// The lifecycle configuration.
        public let resourceLifecycleConfig: ApplicationResourceLifecycleConfig

        @inlinable
        public init(applicationName: String, resourceLifecycleConfig: ApplicationResourceLifecycleConfig) {
            self.applicationName = applicationName
            self.resourceLifecycleConfig = resourceLifecycleConfig
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationName, name: "applicationName", parent: name, max: 100)
            try self.validate(self.applicationName, name: "applicationName", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case applicationName = "ApplicationName"
            case resourceLifecycleConfig = "ResourceLifecycleConfig"
        }
    }

    public struct UpdateApplicationVersionMessage: AWSEncodableShape {
        /// The name of the application associated with this version. If no application is found with this name, UpdateApplication returns an InvalidParameterValue error.
        public let applicationName: String
        /// A new description for this version.
        public let description: String?
        /// The name of the version to update. If no application version is found with this label, UpdateApplication returns an InvalidParameterValue error.
        public let versionLabel: String

        @inlinable
        public init(applicationName: String, description: String? = nil, versionLabel: String) {
            self.applicationName = applicationName
            self.description = description
            self.versionLabel = versionLabel
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationName, name: "applicationName", parent: name, max: 100)
            try self.validate(self.applicationName, name: "applicationName", parent: name, min: 1)
            try self.validate(self.description, name: "description", parent: name, max: 200)
            try self.validate(self.versionLabel, name: "versionLabel", parent: name, max: 100)
            try self.validate(self.versionLabel, name: "versionLabel", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case applicationName = "ApplicationName"
            case description = "Description"
            case versionLabel = "VersionLabel"
        }
    }

    public struct UpdateConfigurationTemplateMessage: AWSEncodableShape {
        /// The name of the application associated with the configuration template to update. If no application is found with this name, UpdateConfigurationTemplate returns an InvalidParameterValue error.
        public let applicationName: String
        /// A new description for the configuration.
        public let description: String?
        /// A list of configuration option settings to update with the new specified option value.
        @OptionalCustomCoding<StandardArrayCoder<ConfigurationOptionSetting>>
        public var optionSettings: [ConfigurationOptionSetting]?
        /// A list of configuration options to remove from the configuration set. Constraint: You can remove only UserDefined configuration options.
        @OptionalCustomCoding<StandardArrayCoder<OptionSpecification>>
        public var optionsToRemove: [OptionSpecification]?
        /// The name of the configuration template to update. If no configuration template is found with this name, UpdateConfigurationTemplate returns an InvalidParameterValue error.
        public let templateName: String

        @inlinable
        public init(applicationName: String, description: String? = nil, optionSettings: [ConfigurationOptionSetting]? = nil, optionsToRemove: [OptionSpecification]? = nil, templateName: String) {
            self.applicationName = applicationName
            self.description = description
            self.optionSettings = optionSettings
            self.optionsToRemove = optionsToRemove
            self.templateName = templateName
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationName, name: "applicationName", parent: name, max: 100)
            try self.validate(self.applicationName, name: "applicationName", parent: name, min: 1)
            try self.validate(self.description, name: "description", parent: name, max: 200)
            try self.optionSettings?.forEach {
                try $0.validate(name: "\(name).optionSettings[]")
            }
            try self.optionsToRemove?.forEach {
                try $0.validate(name: "\(name).optionsToRemove[]")
            }
            try self.validate(self.templateName, name: "templateName", parent: name, max: 100)
            try self.validate(self.templateName, name: "templateName", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case applicationName = "ApplicationName"
            case description = "Description"
            case optionSettings = "OptionSettings"
            case optionsToRemove = "OptionsToRemove"
            case templateName = "TemplateName"
        }
    }

    public struct UpdateEnvironmentMessage: AWSEncodableShape {
        /// The name of the application with which the environment is associated.
        public let applicationName: String?
        /// If this parameter is specified, AWS Elastic Beanstalk updates the description of this environment.
        public let description: String?
        /// The ID of the environment to update. If no environment with this ID exists, AWS Elastic Beanstalk returns an InvalidParameterValue error. Condition: You must specify either this or an EnvironmentName, or both. If you do not specify either, AWS Elastic Beanstalk returns MissingRequiredParameter error.
        public let environmentId: String?
        /// The name of the environment to update. If no environment with this name exists, AWS Elastic Beanstalk returns an InvalidParameterValue error.  Condition: You must specify either this or an EnvironmentId, or both. If you do not specify either, AWS Elastic Beanstalk returns MissingRequiredParameter error.
        public let environmentName: String?
        /// The name of the group to which the target environment belongs. Specify a group name only if the environment's name is specified in an environment manifest and not with the environment name or environment ID parameters. See Environment Manifest (env.yaml) for details.
        public let groupName: String?
        /// If specified, AWS Elastic Beanstalk updates the configuration set associated with the running environment and sets the specified configuration options to the requested value.
        @OptionalCustomCoding<StandardArrayCoder<ConfigurationOptionSetting>>
        public var optionSettings: [ConfigurationOptionSetting]?
        /// A list of custom user-defined configuration options to remove from the configuration set for this environment.
        @OptionalCustomCoding<StandardArrayCoder<OptionSpecification>>
        public var optionsToRemove: [OptionSpecification]?
        /// The ARN of the platform, if used.
        public let platformArn: String?
        /// This specifies the platform version that the environment will run after the environment is updated.
        public let solutionStackName: String?
        /// If this parameter is specified, AWS Elastic Beanstalk deploys this configuration template to the environment. If no such configuration template is found, AWS Elastic Beanstalk returns an InvalidParameterValue error.
        public let templateName: String?
        /// This specifies the tier to use to update the environment. Condition: At this time, if you change the tier version, name, or type, AWS Elastic Beanstalk returns InvalidParameterValue error.
        public let tier: EnvironmentTier?
        /// If this parameter is specified, AWS Elastic Beanstalk deploys the named application version to the environment. If no such application version is found, returns an InvalidParameterValue error.
        public let versionLabel: String?

        @inlinable
        public init(applicationName: String? = nil, description: String? = nil, environmentId: String? = nil, environmentName: String? = nil, groupName: String? = nil, optionSettings: [ConfigurationOptionSetting]? = nil, optionsToRemove: [OptionSpecification]? = nil, platformArn: String? = nil, solutionStackName: String? = nil, templateName: String? = nil, tier: EnvironmentTier? = nil, versionLabel: String? = nil) {
            self.applicationName = applicationName
            self.description = description
            self.environmentId = environmentId
            self.environmentName = environmentName
            self.groupName = groupName
            self.optionSettings = optionSettings
            self.optionsToRemove = optionsToRemove
            self.platformArn = platformArn
            self.solutionStackName = solutionStackName
            self.templateName = templateName
            self.tier = tier
            self.versionLabel = versionLabel
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationName, name: "applicationName", parent: name, max: 100)
            try self.validate(self.applicationName, name: "applicationName", parent: name, min: 1)
            try self.validate(self.description, name: "description", parent: name, max: 200)
            try self.validate(self.environmentName, name: "environmentName", parent: name, max: 40)
            try self.validate(self.environmentName, name: "environmentName", parent: name, min: 4)
            try self.validate(self.groupName, name: "groupName", parent: name, max: 19)
            try self.validate(self.groupName, name: "groupName", parent: name, min: 1)
            try self.optionSettings?.forEach {
                try $0.validate(name: "\(name).optionSettings[]")
            }
            try self.optionsToRemove?.forEach {
                try $0.validate(name: "\(name).optionsToRemove[]")
            }
            try self.validate(self.templateName, name: "templateName", parent: name, max: 100)
            try self.validate(self.templateName, name: "templateName", parent: name, min: 1)
            try self.validate(self.versionLabel, name: "versionLabel", parent: name, max: 100)
            try self.validate(self.versionLabel, name: "versionLabel", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case applicationName = "ApplicationName"
            case description = "Description"
            case environmentId = "EnvironmentId"
            case environmentName = "EnvironmentName"
            case groupName = "GroupName"
            case optionSettings = "OptionSettings"
            case optionsToRemove = "OptionsToRemove"
            case platformArn = "PlatformArn"
            case solutionStackName = "SolutionStackName"
            case templateName = "TemplateName"
            case tier = "Tier"
            case versionLabel = "VersionLabel"
        }
    }

    public struct UpdateTagsForResourceMessage: AWSEncodableShape {
        /// The Amazon Resource Name (ARN) of the resouce to be updated. Must be the ARN of an Elastic Beanstalk resource.
        public let resourceArn: String
        /// A list of tags to add or update. If a key of an existing tag is added, the tag's value is updated. Specify at least one of these parameters: TagsToAdd, TagsToRemove.
        @OptionalCustomCoding<StandardArrayCoder<Tag>>
        public var tagsToAdd: [Tag]?
        /// A list of tag keys to remove. If a tag key doesn't exist, it is silently ignored. Specify at least one of these parameters: TagsToAdd, TagsToRemove.
        @OptionalCustomCoding<StandardArrayCoder<String>>
        public var tagsToRemove: [String]?

        @inlinable
        public init(resourceArn: String, tagsToAdd: [Tag]? = nil, tagsToRemove: [String]? = nil) {
            self.resourceArn = resourceArn
            self.tagsToAdd = tagsToAdd
            self.tagsToRemove = tagsToRemove
        }

        public func validate(name: String) throws {
            try self.tagsToAdd?.forEach {
                try $0.validate(name: "\(name).tagsToAdd[]")
            }
            try self.tagsToRemove?.forEach {
                try validate($0, name: "tagsToRemove[]", parent: name, max: 128)
                try validate($0, name: "tagsToRemove[]", parent: name, min: 1)
            }
        }

        private enum CodingKeys: String, CodingKey {
            case resourceArn = "ResourceArn"
            case tagsToAdd = "TagsToAdd"
            case tagsToRemove = "TagsToRemove"
        }
    }

    public struct ValidateConfigurationSettingsMessage: AWSEncodableShape {
        /// The name of the application that the configuration template or environment belongs to.
        public let applicationName: String
        /// The name of the environment to validate the settings against. Condition: You cannot specify both this and a configuration template name.
        public let environmentName: String?
        /// A list of the options and desired values to evaluate.
        @CustomCoding<StandardArrayCoder<ConfigurationOptionSetting>>
        public var optionSettings: [ConfigurationOptionSetting]
        /// The name of the configuration template to validate the settings against. Condition: You cannot specify both this and an environment name.
        public let templateName: String?

        @inlinable
        public init(applicationName: String, environmentName: String? = nil, optionSettings: [ConfigurationOptionSetting], templateName: String? = nil) {
            self.applicationName = applicationName
            self.environmentName = environmentName
            self.optionSettings = optionSettings
            self.templateName = templateName
        }

        public func validate(name: String) throws {
            try self.validate(self.applicationName, name: "applicationName", parent: name, max: 100)
            try self.validate(self.applicationName, name: "applicationName", parent: name, min: 1)
            try self.validate(self.environmentName, name: "environmentName", parent: name, max: 40)
            try self.validate(self.environmentName, name: "environmentName", parent: name, min: 4)
            try self.optionSettings.forEach {
                try $0.validate(name: "\(name).optionSettings[]")
            }
            try self.validate(self.templateName, name: "templateName", parent: name, max: 100)
            try self.validate(self.templateName, name: "templateName", parent: name, min: 1)
        }

        private enum CodingKeys: String, CodingKey {
            case applicationName = "ApplicationName"
            case environmentName = "EnvironmentName"
            case optionSettings = "OptionSettings"
            case templateName = "TemplateName"
        }
    }

    public struct ValidationMessage: AWSDecodableShape {
        /// A message describing the error or warning.
        public let message: String?
        /// The namespace to which the option belongs.
        public let namespace: String?
        /// The name of the option.
        public let optionName: String?
        /// An indication of the severity of this message:    error: This message indicates that this is not a valid setting for an option.    warning: This message is providing information you should take into account.
        public let severity: ValidationSeverity?

        @inlinable
        public init(message: String? = nil, namespace: String? = nil, optionName: String? = nil, severity: ValidationSeverity? = nil) {
            self.message = message
            self.namespace = namespace
            self.optionName = optionName
            self.severity = severity
        }

        private enum CodingKeys: String, CodingKey {
            case message = "Message"
            case namespace = "Namespace"
            case optionName = "OptionName"
            case severity = "Severity"
        }
    }
}

// MARK: - Errors

/// Error enum for ElasticBeanstalk
public struct ElasticBeanstalkErrorType: AWSErrorType {
    enum Code: String {
        case codeBuildNotInServiceRegionException = "CodeBuildNotInServiceRegionException"
        case elasticBeanstalkServiceException = "ElasticBeanstalkServiceException"
        case insufficientPrivilegesException = "InsufficientPrivilegesException"
        case invalidRequestException = "InvalidRequestException"
        case managedActionInvalidStateException = "ManagedActionInvalidStateException"
        case operationInProgressException = "OperationInProgressFailure"
        case platformVersionStillReferencedException = "PlatformVersionStillReferencedException"
        case resourceNotFoundException = "ResourceNotFoundException"
        case resourceTypeNotSupportedException = "ResourceTypeNotSupportedException"
        case s3LocationNotInServiceRegionException = "S3LocationNotInServiceRegionException"
        case s3SubscriptionRequiredException = "S3SubscriptionRequiredException"
        case sourceBundleDeletionException = "SourceBundleDeletionFailure"
        case tooManyApplicationVersionsException = "TooManyApplicationVersionsException"
        case tooManyApplicationsException = "TooManyApplicationsException"
        case tooManyBucketsException = "TooManyBucketsException"
        case tooManyConfigurationTemplatesException = "TooManyConfigurationTemplatesException"
        case tooManyEnvironmentsException = "TooManyEnvironmentsException"
        case tooManyPlatformsException = "TooManyPlatformsException"
        case tooManyTagsException = "TooManyTagsException"
    }

    private let error: Code
    public let context: AWSErrorContext?

    /// initialize ElasticBeanstalk
    public init?(errorCode: String, context: AWSErrorContext) {
        guard let error = Code(rawValue: errorCode) else { return nil }
        self.error = error
        self.context = context
    }

    internal init(_ error: Code) {
        self.error = error
        self.context = nil
    }

    /// return error code string
    public var errorCode: String { self.error.rawValue }

    /// AWS CodeBuild is not available in the specified region.
    public static var codeBuildNotInServiceRegionException: Self { .init(.codeBuildNotInServiceRegionException) }
    /// A generic service exception has occurred.
    public static var elasticBeanstalkServiceException: Self { .init(.elasticBeanstalkServiceException) }
    /// The specified account does not have sufficient privileges for one or more AWS services.
    public static var insufficientPrivilegesException: Self { .init(.insufficientPrivilegesException) }
    /// One or more input parameters is not valid. Please correct the input parameters and try the operation again.
    public static var invalidRequestException: Self { .init(.invalidRequestException) }
    /// Cannot modify the managed action in its current state.
    public static var managedActionInvalidStateException: Self { .init(.managedActionInvalidStateException) }
    /// Unable to perform the specified operation because another operation that effects an element in this activity is already in progress.
    public static var operationInProgressException: Self { .init(.operationInProgressException) }
    /// You cannot delete the platform version because there are still environments running on it.
    public static var platformVersionStillReferencedException: Self { .init(.platformVersionStillReferencedException) }
    /// A resource doesn't exist for the specified Amazon Resource Name (ARN).
    public static var resourceNotFoundException: Self { .init(.resourceNotFoundException) }
    /// The type of the specified Amazon Resource Name (ARN) isn't supported for this operation.
    public static var resourceTypeNotSupportedException: Self { .init(.resourceTypeNotSupportedException) }
    /// The specified S3 bucket does not belong to the S3 region in which the service is running. The following regions are supported:   IAD/us-east-1   PDX/us-west-2   DUB/eu-west-1
    public static var s3LocationNotInServiceRegionException: Self { .init(.s3LocationNotInServiceRegionException) }
    /// The specified account does not have a subscription to Amazon S3.
    public static var s3SubscriptionRequiredException: Self { .init(.s3SubscriptionRequiredException) }
    /// Unable to delete the Amazon S3 source bundle associated with the application version. The application version was deleted successfully.
    public static var sourceBundleDeletionException: Self { .init(.sourceBundleDeletionException) }
    /// The specified account has reached its limit of application versions.
    public static var tooManyApplicationVersionsException: Self { .init(.tooManyApplicationVersionsException) }
    /// The specified account has reached its limit of applications.
    public static var tooManyApplicationsException: Self { .init(.tooManyApplicationsException) }
    /// The specified account has reached its limit of Amazon S3 buckets.
    public static var tooManyBucketsException: Self { .init(.tooManyBucketsException) }
    /// The specified account has reached its limit of configuration templates.
    public static var tooManyConfigurationTemplatesException: Self { .init(.tooManyConfigurationTemplatesException) }
    /// The specified account has reached its limit of environments.
    public static var tooManyEnvironmentsException: Self { .init(.tooManyEnvironmentsException) }
    /// You have exceeded the maximum number of allowed platforms associated with the account.
    public static var tooManyPlatformsException: Self { .init(.tooManyPlatformsException) }
    /// The number of tags in the resource would exceed the number of tags that each resource can have. To calculate this, the operation considers both the number of tags the resource already has and the tags this operation would add if it succeeded.
    public static var tooManyTagsException: Self { .init(.tooManyTagsException) }
}

extension ElasticBeanstalkErrorType: Equatable {
    public static func == (lhs: ElasticBeanstalkErrorType, rhs: ElasticBeanstalkErrorType) -> Bool {
        lhs.error == rhs.error
    }
}

extension ElasticBeanstalkErrorType: CustomStringConvertible {
    public var description: String {
        return "\(self.error.rawValue): \(self.message ?? "")"
    }
}
